补码问题

为什么一个字节的存储范围是-128-127或者0到255呢。

分析:1字节8个位,
0000 0000 - 1111 1111 表示0 - 255

那么按照道理说,如果第一位表示正负的话,应该这么表示
0 0000000 - 0 1111111 表示 0 - 127
1 0000000 - 1 1111111 表示 -0 - -127
应该是从-127到+127的呀。

那么-128到127是怎么来的呢?

这里涉及到二进制补码的问题。

如上理解的话,+0,-0则重复了,浪费了一种存储的可能性。

因此,计算机猴子那个的负数,不是照着后面的绝对值(符号位后面的所有位)直接乘以-1得到的。而是用补码规则换算的。

负数 = 绝对值位 - 128
比如,对于1 1111111 = 127 - 128 = -1
同样,对于 1 0000000 = 0 - 128 = -128

因此,最终结果,应该是-128 到 +127之间。

————————————————————————————————
————————————————————————————————

总结:

  • 1个字节,8个位,范围:
    无符号:0 - 2^8 - 1 ==> 0 - 255
    有符号: - 2^7 ~ + 2^7 -1 == > -128 ~ + 127

  • 2个字节,16位,范围:
    无符号:0 - 2^16 - 1 ==> 0 - 65535
    有符号: - 2^15 ~ + 2^15 -1 == > -32768 ~ + 32767

一般而言,设某类型N字节,则有8N位,
无符号:0 - 2^8N - 1
有符号: - 2^(8N - 1 ) ~ + 2^(8N - 1 ) -1

你可能感兴趣的:(补码问题)