c语言:原码,反码 补码

c语言:原码,反码 补码,第1张

1)原码表示

原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。

例如,X1=

+1010110

X2=

一1001010

其原码记作:

[X1]原=[+1010110]原=01010110

[X2]原=[-1001010]原=11001010

在原码表示法中,对0有两种表示形式:

[+0]原=00000000

[-0]

原=10000000

2)补码表示

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。

例如,[X1]=+1010110

[X2]=

一1001010

[X1]原=01010110

[X1]补=01010110

[X1]原=[X1]补=01010110

[X2]

原=

11001010

[X2]

补=10110101+1=10110110

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。

例如,[X1]=+1010110

[X2]=

一1001010

[X1]原=01010110

[X1]补=01010110

[X1]原=[X1]补=01010110

[X2]

原=

11001010

[X2]

补=10110101+1=10110110

(3)反码表示法

机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。

例如:X1=

+1010110

X2=

一1001010

[X1]原=01010110

[X1]反=[X1]原=01010110

[X2]原=11001010

[X2]反=10110101

反码通常作为求补过程的中间形式,即在一个负数的反码的未位上加1,就得到了该负数的补码。

例1

已知[X]原=10011010,求[X]补。

分析如下:

由[X]原求[X]补的原则是:若机器数为正数,则[X]原=[X]补;若机器数为负数,则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到。现给定的机器数为负数,故有[X]补=[X]原十1,即

[X]原=10011010

[X]反=11100101+1

[X]补=11100110

例2

已知[X]补=11100110,求[X]原。

分析如下:

对于机器数为正数,则[X]原=[X]补

对于机器数为负数,则有[X]原=[[X]补]补

现给定的为负数,故有:

[X]补=11100110

[[X]补]反=10011001+1

[[X]补]补=10011010=[X]原+1

[[X]补]补=10011010=[X]原

总结一下,原码(为负时,正时都不变)全部取反即得到反码,反码加

"1"就得到补码了,就是这么简单。

补码主要是为了cpu运算器在进行减法运算时避免借位而设立的。

在早期,cpu中的运算器部分,只要实现一个加法器就可以完成四由算术运算。

因为计算机中的数值编码是有限位数的,所以减法实际上相当于加上减数的补码,而乘法是循环的加法,除法是循环的减法。这种思想在数学上叫转化思想,在兵法上与”借刀杀人“、”借尸还魂“的借是“异曲同工”,用牛顿的话叫做“站在巨人的肩上“。

举例说明,以8位的二进制为例,要计算1-1,只要用1加上-1的补码即可。

-1的原码:1000 0001,最高位是符号为,1表示负数,0表示正数。

-1的反码:1111 1110, 按位取反是除符号位以外,其它每个位上的0变成1,1变成0。

-1的补码:1111 1111,在反码的基础上是加上1即为补码。

1-1 = 1+ 1111 1111 = 1 0000 0000 ,因为只有8位的二进制表示方法,此时溢出了,溢出位在硬件上是没法表示的,因此结果还是0

C语言中二进制求补码过程中取反后再加1,那个1是怎么加的?跪求!

可以通过如下2个实例来看看二进制中求补码的过程。

实例1:求5的补码

说明:对于正数,其源码、反码和补码均相同。

5的源码:0000 0101

5的反码:0000 0101

5的补码:0000 0101

实例1:求-5的补码

说明:对于负数,其反码是源码各位取反(不包括符号位),其补码是反码加1。

-5的源码:1000 0101

-5的反码:1111 1010 (源码的各位取反,不包括符号位(最高位))

-5的补码:1111 1011 (反码加1,即在最低位加1)

C语言中二进制求补码过程中取反后再加1,那个1是怎么加的?

二进制运算当然是在二进制数字间的运算。正数的补码等于原码,负数的补码就是取反加一(符号位不动)。举个“栗子”:

求-7的补码。

因为给定数是负数,则符号位为“1”。

后七位:-7的原码(10000111)→按位取反(11111000)(负数符号位不变)→加1(11111001 加在末尾了),所以-7的补码是11111001。

如果末位为1,加1后要进位,即‘10’。二进制只有0和1,不会出现‘2’的。

c语言中二进制补码问题

32767=2的15次方-1 = 01111111 11111111 你怎么得来的“原码是1100000000001001”??

原码:人为规定的一种数据概念,最高位为符号位,其余位为数值位,实际应用中不用

反码:也是人为规定的数据概念,正数原码即是反码,负数反码:符号位不动,数值位按位取反,实际应用中不用

补码:计算机中实际存储数据的格式,真正的数据应用。

正数的原码即是补码

负数的补码是反码+1

c语言中的二进制补码

(1)正数的补码:与原码相同。

(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

1+1= C语言中二进制的算法

等于10,二进制以2为整

14的二进制原码,取反,再加1得其补码,我知道原码,想知道取反是怎么算出来,再加1得其补码,就是想知道

假如是负数,反码就是原码表示符号的最高位不变,0变成1,1变成0。补码就是在原码的基础上再加1。

假如是正数,那么原码、反码、补码都跟原码相同 不用再进行上述处理。

你说的14 是正数,不用进行取反再加1来计算其补码,它的补码就是00001110

c语言中,原码补码反码都必须是二进制吗?

不需要,求补码是一种运算,参与运算的数值是整数就可以,不需要是二进制。但是计算机在内部处理的时候是转换成二进制进行处理的。C语言可以计算15的反码为-16,这个按照反码的定义是对的。代码如下:

#include <stdioh>

int main(void) {

int a,b;

a = 15;

b = ~a;

printf("b=%d\n",b);

return 0;

}

c语言 二进制补码加法程序怎么写?

转化成补码就加呗

1 + 2 = 3

1 的补码 + 2 的补码 = 3 的补码

0001 + 0010 = 0011

C语言中二进制全1什么意思

多少位都是1,如8位全是1,那正数就是0xff

~

C语言求二进制补码 源代码

输入任意整数,输出32位的补码。

输入其他,结束程序。

#include<stdioh>

int main()

{

int i,num=0;

char s[33]={0};

while(1==scanf("%d",&num)){

for(i=0;i<32;i++){

s[i]= (0x01 & (num>>(31-i))) '1' : '0' ;

}

printf("%s\n",s);

}

return 0;

}

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

在C语言中反码补码 在实际应用中有什么作用!?

请知道的朋友告诉我! 谢谢了。

在学习反码补码的时候有这样的疑问!!

解析:

这和C语言没什么关系

补码在实际中应用最广,基本都是以补码来存储

反码。。。没啥用

概述

在计算机内,有符号数有3种表示法:原码、反码和补码。

在计算机中,数据是以补码的形式存储的,所以补码在c语言的教学中有比较重要的地位,而讲解补码必须涉及到原码、反码。

详细释义

所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

原码、反码和补码的表示方法

定点整数表示法

定点小数小时法

反码

正数:正数的反码与原码相同。

负数:负数的反码,符号位为“1”,数值部分按位取反。

例如: 符号位 数值位

[+7]反= 0 0000111 B

[-7]反= 1 1111000 B

注意:

a 数0的反码也有两种形式,即

[+0]反=00000000B

[- 0]反=11111111B

b 8位二进制反码的表示范围:-127~+127

原码

在数值前直接加一符号位的表示法。

例如: 符号位 数值位

[+7]原= 0 0000111 B

[-7]原= 1 0000111 B

注意:

数0的原码有两种形式:

[+0]原= 00000000B

[-0]原= 10000000B

位二进制原码的表示范围:-127~+127

补码

1)模的概念:把一个计量单位称之为模或模数。

例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。

对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。

10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。

2)补码的表示:

正数:正数的补码和原码相同。

负数:负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

例如: 符号位 数值位

[+7]补= 0 0000111 B

[-7]补= 1 1111001 B

补码在微型机中是一种重要的编码形式,请注意:

a 采用补码后,可以方便地将减法运算转化成加法运算,运算过程得到简化。

正数的补码即是它所表示的数的真值,而负数的补码的数值部份却不是它所表示的数的真值。

采用补码进行运算,所得结果仍为补码。

b 与原码、反码不同,数值0的补码只有一个,即

[0]补=00000000B。

若字长为8位,则补码所表示的范围为-128~+127;进行补码运算时,应注意所得结果不应超过补码所能表示数的范围。

原码、反码和补码之间的转换

由于正数的原码、补码、反码表示方法均相同,不需转换。

在此,仅以负数情况分析。

(1) 已知原码,求补码。

例:已知某数X的原码为10110100B,试求X的补码和反码

解:由[X]原=10110100B知,X为负数。求其反码时,符号位不变,数值部分按位求反;求其补码时,再在其反码的末位加1。

1 0 1 1 0 1 0 0 原码

1 1 0 0 1 0 1 1 反码,符号位不变,数值位取反

1 1 0 0 1 1 0 0 补码,符号位不变,数值位取反+1

故:[X]补=11001100B,[X]反=11001011B。

(2) 已知补码,求原码。

分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1 有方法。

例:已知某数X的补码11101110B,试求其原码。

解:由[X]补=11101110B知,X为负数。

1 1 1 0 1 1 1 0 补码

1 1 1 0 1 1 0 1 反码(符号位不变,数值位取反加1)

1 0 0 1 0 0 1 0 原码(符号位不变,数值位取反)

关于补码的补充例子:

一个正的整数的补码就是这个整数变成二进制的值。

举例:一个int型变量i=10,其二进制补码就是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A)

2 一个负整数的二进制补码,就是该负数的绝对值所对应的补码全部取反后加1

举例:int i=-10的补码如何求得:

先求-10的绝对值10的补码是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A);

再将求得的补码取反: 1111 1111 1111 1111 1111 1111 1111 0101

再将取反后得到的补码加1: 1111 1111 1111 1111 1111 1111 1111 0101 + 1

即可得到-10的二进制补码: 1111 1111 1111 1111 1111 1111 1111 0110(0xFFFFFFF6)

3 +0和-0的二进制补码都是0

首先+0的二进制补码是0;

-0的二进制补码是+0的二进制补码取反后加1,+0的二进制补码为0,取反后为FFFFFFFF,加1后还是0

原码和反码在数值0都有二意,唯有补码在数值0是唯一的码值!

以上就是关于c语言:原码,反码 补码全部的内容,包括:c语言:原码,反码 补码、在C语言中补码什么意思、C语言中二进制求补码过程中取反后再加1,那个1是怎么加的跪求!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9459633.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存