
为什么C语言中short int 范围是-32768---32767 而不是 -(2^16-1)---32767?
-(2^16-1)---32767总的状态数远远大于2^16种,所以不能用16位的二进制来表示的。
是有号数
2补数取负值 (反相加1) *-1
0x0000(0) == 0xFFFF + 1 =-(0x10000) => 0
0x0001(1) == 0xFFFE + 1 =-(0xFFFF) => -(-1) => 1
0xFFFF(-1) == 0x0000 + 1 =-(0x0001) => -1
-100赋值
100 =>0x0064 =Inv=>0xFF9B
-100==>0xFF9B+1 =0xFF9C ==>65436

请问,如果将-100赋值给一个无符号的变量,会得到一个什么样的数?是怎么得到的?
-100在内存中占多少bit?
整型变量,在计算机中是用 16 位二进制数存放的。
16 位二进制数的取值范围是:
0000 0000 0000 0000 ~ 1111 1111 1111 1111。
取值范围,换算到十进制,就是:0 ~ 65535。
16 位二进制数共有 65536 个值,它们都是无符号数。
但是,它们也可以“代表”有符号数。
只要“把二进制数的首位,确定为负数”,它们就“代表”有符号数了。
这就是所谓的“补码”。
--------------------------
八位的二进制数,本来都是无符号数。它们“所代表的有符号数”如下表所示:
8 位二进制数的取值范围是:0 ~ 255。
只要把其首位当成-2^(8-1) = -128,它们就可以代表:-128 ~ +127。
换算的方法,也不过就是常见的“进制转换”而已,你可在上表中观察到的。
你就以此类推吧。
16 位二进制数的取值范围是:0 ~ 65535。
只要把其首位当成-2^(16-1) = -32768,它们就可以代表:-32768 ~ +32767。
--------------------------
所谓的“补码”、所谓的“整型数”,在计算机专业的书上,都是吹出天花来了!
其实,也不过就是“二进制数的首位,是个负数”,仅此而已。