1、C语言之父,谭浩强老司机曾经教导我们,正数在计算机中的二进制表示,原码、反码、补码都是相同的,等于原码。
2、负数在计算机中,以其补码的形式表示。
3、以signed short举例,为什么计算机中,它的范围是-32768~32767呢,负数怎么比正数多了一个呢?
我们知道,signed short 16位中,第一位是用于表示符号的,0表示正,1表示负。
比如:-2,原码为1000 0000 0000 0010
反码为 1111 1111 1111 1101
补码为 1111 1111 1111 1110
4、我们来看一个特殊的数+0和-0。
+0的二进制形式为:0000 0000 0000 0000;现在我们看-0的二进制表示
-0的原码:1000 0000 0000 0000
-0的反码:1111 1111 1111 1111
-0的补码: 0000 0000 0000 0000
我们得到:+0和-0的补码是相同的都是0000 0000 0000 0000
1000 0000 0000 0000 表示-32768,多出了一个编码,并且消除了+0和-0的差异,多伟大的创作啊!
5、-32768 - 1等于多少呢?
我们已经知道-32768用1000 0000 0000 0000 表示,那么减去1呢?
其实计算机运算,减法都可以转换成加法运算,神奇的加法器。
-32768 - 1 = (-32768)+(-1) -1的补码为1111 1111 1111 1111
1000 0000 0000 0000 + 1111 1111 1111 1111 = 0111 1111 1111 1111
0111 1111 1111 1111的十进制表示32767。
6、-32768 - 1 = 32767, 充满了哲学的味道,否极泰来,天堂与地狱近在咫尺。
7、同样的,32767 + 1 = -32768。
8、于是对于一个类型,比如32位的signed int,它的最小值,就是
1000 0000 0000 0000 0000 0000 0000 0000,用16进制表示为0x80000000,移位最简单(1<<31)
它的最大值为0111 1111 1111 1111 1111 1111 1111 1111,用16进制为0x7FFFFFFF。