c语言里二进制数
15.1.2有符号整数有符号数的表示方法是由硬件决定,而不是由C决定的.或许表示有符号数最简单的方法就是保留1位(比如高位)来表示数的符号.在一个1字节值中,该方法为数字...
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 展开
有符号数的表示方法是由硬件决定, 而不是由 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
补码才是计算机中存储的数据形式!!原码、反码只是两个中间概念词,应用中用不到,是计算机发展过程中的中间产物。
以一个字节(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
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询