use*_*694 10 binary twos-complement
在2的补码中,0-127表示为00000000到01111111.在负数的情况下,我们反转无符号表示中的所有位并加1以得到2的补码.
(参考:http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement)
因此,2的补码中的-1将是:
unsigned 1 = 00000001 invert all bits = 11111110 add 1 = 11111111
但对于-128,如果我们遵循相同的步骤:
unsigned 128 = 10000000 invert all bits= 01111111 add 1= 10000000
所以-128和128在2的补码表示法中具有相同的表示形式?为什么8位的2的补码范围不是-127到128?简而言之,为什么-128优先于使用相同位数表示无符号128?
Rin*_*g Ø 11
有符号字节中没有"128".范围是
总共256个值,即2 ^ 8.
基于评论的附录(并重读该问题)
0x80可以被认为是-128,或+128.维基百科的解释值得一读
该范围内的最小数字的二进制补码将不具有否定数字的期望效果.
例如,8位系统中的-128的二进制补码产生相同的二进制数.这是因为128的正值不能用8位有符号二进制数表示.注意,这被检测为溢出条件,因为存在进位但不存在最高有效位.这可能会导致意外错误,因为在最小负数的情况下,未经检查的绝对值实现可能会返回负数.C中的整数函数的abs族通常具有此行为.Java也是如此.在这种情况下,开发人员可以决定在调用函数之前是否检查最小负值.
二进制补码中最负的数字有时称为"奇数",因为它是唯一的例外.虽然该数字是例外,但它是常规二进制补码系统中的有效数字.所有算术运算都使用它作为操作数和(除非有溢出)结果.
右移有符号整数的右移会使CPU将MSb(第7位)传播到右边,如果0x80是+128 则会违反简单逻辑,因为在仅一次移位后,我们将获得0xC0哪个为负数( -64)......(从正数右移通常不会产生负面结果).
由于符号位约定,-128优于128.在带符号的数字表示中,最高有效位被视为符号位.如果该位为1,则该数字为负数.在128和-128(10000000)的表示中,该位为1,因此它表示-128,而不是128.
见http://en.wikipedia.org/wiki/Sign_bit