以2字节为例来说:
对于无符号的数值(原码及补码都一样),最小值是0,最大值是1111 1111 1111 1111=216-1=65535,共有216个编码。
对于有符号的来说较为复杂:
1)原码表示
最大值:0111 1111 1111 1111=215-1=32767
最小值:1111 1111 1111 1111=-(215-1)=-32767
正0和负0:0000000000000000=1000000000000000=0
因为有两个0的存在,所以共有216个编码。
但是计算机采用二进制补码存储数据。
1)补码表示
最大值:0111 1111 1111 1111=215-1=32767
负数需要把除符号位以后的部分取反加一,即-32767的补码为1000 0000 0000 0001。
正0:0000 0000 0000 0000,负0:经过非符号位取反(1111 1111 1111 1111)加1后,同样变成了0000 0000 0000 0000,也就是说正0和负0在补码系统中编码是一样的。因为16位二进制数可以表示216个编码,所以补码需要比原码多一个数编码出来,这个数为-32768,编码为1000000000000000。所以补码系统中,范围是-32768~32767。
整型范围:
unsigned int 0~2^32-1=0~4294967295
int -2^31~2^31-1=-2147483648~2147483647
unsigned long 0~2^32-1=0~4294967295
long -2^31~2^31-1=-2147483648~2147483647
unsigned long long 0~2^64-1=0~1844674407370955161
long long -2^63~2^63-1=-9223372036854775808~9223372036854775807
unsigned __int64 0~2^64-1=0~1844674407370955161
__int64 -2^63~2^63-1=-9223372036854775808~9223372036854775807