c语言中有符号数的取值范围问题:
比如char类型 [-128,127],当为正数时 0111 1111(二进制)对应十进制 127,这没有任何问题。
但是当为负数时 -128 是怎样得到的呢?
最高位为1时候代表负数,我们通常会认为11111111的时候是最小值即-127(当表示原码的时候 最小值-127是对的)
其实不是这样的,因为计算机是采用的补码形式,根据补码的规则11111111应该是个负数
11111111 反推过去(减1 取反)会得到原码是00000001,所有它代表是数字1,所以11111111是-1的补码
同理
[-1]=1111111
[-2]=1111110
[-3]=1111101
[-4]=1111100
................
[-128]10000000
10000000是最小的值了
-128是这样来的。
其它的数据类型也是类似的道理。