作业帮 > 综合 > 作业

c语言里二进制数15.1.2 有符号整数有符号数的表示方法是由硬件决定,而不是由 C 决定的.或许表示有符号数最简单的方

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/19 12:41:10
c语言里二进制数
15.1.2 有符号整数
有符号数的表示方法是由硬件决定,而不是由 C 决定的.或许表示有符号数最简单的方法就是保留 1 位 (比如高位) 来表示数的符号.在一个 1 字节值中,该方法为数字本身留下 7 位.使用这样的符号量 (sign-magnitude) 表示法,10000001 表示 -1,00000001 表示 1.那么整个范围是 -127 到 +127
二进制补码 (tow s-complement) 方法避免了这种问题,是当今使用最普遍的系统.我们将讨论这种方法于 1 字节值时的情况.在这种情形下,使用最后 7 位表示从 0 到 127 的值,同时高位设置为 0.这部分与符号量方法相同,同样地,如果高位是 1 ,那么该值为 负.两种方法的区别在于确定该负数值的方法.从一个 9 位组合 100000000 (256 的二进制形式) 中减去一个负数的位组合,结果是该负数值的数量.
例如,假设一个负数的位组合为 10000000.作为一个无符号字节,该组合为 127.作为一个有符号的值,该组合为负 (位 7 是 1 ),并且值为 100000000 - 10000000,即 10000000 (128).因此,该数为 -128 (在符号量表示法中该数为 -0).与之类似,10000001 是 -127,11111111 是 -1.该方法表示数的范围是 -128 到 +127.
要对一个二进制补码数取相反数,最简单的方法是反转每一位 (将 0 变成 1 ,将 1 变成 0 ),然后加 1.因为 1 是 00000001,所以 -1 是 11111110 + 1 ,即 11111111 ,和前面所看到的是一致的.
二进制反码 (one s - complement) 方法通过反转位组合中的每一位以形成一个数的负数.例如,00000001 是 1 ,11111110 是 -1 .这种方法也有一个 -0:11111111.其范围是 (对于 1 字节值) 是 -127 到 +127 .
麻烦高手帮忙画个图他这里是如何算的?
是这样么?
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 4 8 16 32 64 128 -1 -2 -4 -8 -16 -32 -64
计算机数据(整数类)有三个概念原码、 反码 、补码,而计算机实际应用中所用到的只有补码!
以一个字节(8bits)为例说明
原码:第一位为符号位,其余位表示数值, 如0 000 0001表示1 ,1 000 0001表示-1
反码:正数原码即是其反码,负数反码为:符号位不动,其余位取反,即0变1,1变0,如:-1反=1 111 1110
补码:正数原码即是其补码,负数补码为反码+1,即-1补=1 111 1111
补码才是计算机中存储的数据形式!原码、反码只是两个中间概念词,应用中用不到,是计算机发展过程中的中间产物.
再问: 明白了,那请问下a = 2;a = ~a;输出为什么是-3?
再答: char a=2; a=0000 0010 ~a的意思是取反,取反操作是按bit取反,0变1,1变0,这个操作与符号位无关 ~a=1111 1101 它表示出来的是补码!! 补码解释成原码:按原变补顺序逆序操作,即, 先-1为:1111 1101-1=1111 1100 再取反码:符号位不动,数值位取反 1111 1100反码:1000 0011 第一位是符号位,余位为数值 第一位1表示负数 0011=2+1=3 故结果为-3
再问: 明白了,就是转到补码的时候是-1然后在转回来就是-1+2==-3
再答: 你也许看明白了,但我看你写的内容是糊涂了,呵呵 -1+2=-3??
再问: 我给你看我这里的代码和输出吧。
再答: ~a=1111 1101 这是补码,翻译过来就是-3,翻译过程如下: 1.补码减1为:1111 1101-1=1111 1100 2.上述结果再取反码:符号位不动,数值位取反,结果为原码 1111 1100反码:1000 0011 到这里,按原码的定义再解释就是-3了 第一位1表示负数 , 000 0011表示3,所以是-3