有符号类型的最小负数的补码的由来
2010-09-14 13:28
267 查看
一、 16位的有符号整数(int)
在计算机中是用补码存储数据 为什么不用原码存 就是因为原码表示不了最小值-32768 如果是原码表示的话,编码中+0是用16个0表示,-0是用1后跟15个0表示 但是由于+0等于-0所以相当于多花了一个编码来编码0 那么用补码会怎样 补码+0编码出来是16个0 -0 = [1000000000000000]原 = [1111111111111111]反 = [(1)0000000000000000]补 其中1溢出不管了 剩下的是16个0与+0编码相同 这样一来用16位进行编码如果按原码编码可以覆盖-32767~32767[1111111111111111~0111111111111111] 而用补码编码只覆盖到[1000 0000 0000 0001 ~ 0111 1111 1111 1111]其中[1000000000000000]补 用不到 于是规定了用它表示最小值-32768 因此,在考虑16位有符号整数时,-32768只有补码[1000000000000000],没有原码,只是硬性规定补码[1000000000000000]表示
-32768
当然如果你考虑的是大于16位来编码的话,-32768肯定能正常编码,-32768 的正常编码如下:
源码 1 1000 0000 0000 0000
反码 1 0111 1111 1111 1111
补码 1 0111 1111 1111 1111
+ 1
=1 1000 0000 0000 0000
所以正常的-32768的补码应该是要17位表示,为1 1000 0000 0000 0000
二、 8位的有符号整数(int)
8位,即2^8=256,8位可以表示256个数值。
因为正数的原码、反码和补码相同,即[0000 0001]补 ~ [0111 1111]补 表示正数的范围为1到127;
+0和-0的补码相同,都为[0000 0000]补,即都用这一个补码表示;
-1的补码:[1000 0001]原=[1111 1110]反=[1111 1111]补
-127的补码:[1111 1111]原=[1000 0000]反=[1000 0001]补
所以现在表示-127 到 127 的补码范围为(共255个数值):
[1000 0001]补 ~ [0111 1111]补, -127 ~ 127 之间的值的补码就在这个补码范围之间。
而8位是可以表示256个数值的,即还有一个补码没用到,根据上述范围描述可知,是[1000 0000]补 没用到。
故规定用[1000 0000]补 表示-128 -------呵呵,不浪费任何可用资源哦。
补充:
负数补码符号位为1,再另加7位,而7位的可能排列组合为2^7=128;
同理正数的补码符号位是0,再另加7位,7位的可能排列组合也是2^7=128;
所以,正负数补码的可能排列组合之和就是128 + 128 = 256,与开头计算的8位能表达的可能数值为2^8=256结果一致。
Tips:
已知[X]补=11100110,求[X]原。 分析如下: 对于机器数为正数,则[X]原=[X]补 对于机器数为负数,则有[X]原=[[X]补]补现给定的为负数,故有: [X]补=11100110 [[X]补]反=10011001 十) 1 [[X]补]补=10011010=[X]原 分析:按照求负数补码的逆过程,数值部分应是最低位减1,然后取反。但是对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1的方法,即对于机器数为负数,则有[X]原=[[X]补]补。 当然你也可以用先减1后取反的方法来求补码对应的原码。
相关文章推荐
- 有符号类型的最小负数的补码的由来
- 有符号类型的最小负数的补码的由来
- 无符号类型赋值负数,以及求绝对值
- c++ int 负数 补码 隐式类型转换
- 以C程序角度探究计算机里int 类型的存储与最大数最小数,为什么负数补码存储
- 有符号类型数据带来的原码、反码、补码思考
- 有符号数在内存中是以其补码的形式存在的【如何求一个负数的补码】
- 数据类型范围,有符号类型无符号类型,正负, 反码补码的终极理解,一看就懂
- 有符号数据类型的最小值问题丨C
- 隐式类型转换&& 负数的补码
- 隐式类型转换和负数的补码
- 隐式类型转换&& 负数的补码
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767
- 最小负数补码的思考
- 最小负数补码的思考
- 无符号整型被赋值负数的时候出现的陷阱、对图像数据进行操作时要注意数据类型的一致。
- 关于反码,byte最大值127,最小值-128的由来缘由以及书本上从未讲解过的反码补码功能作用
- 隐式类型转换&& 负数的补码