c++中带符号二进制数的表示
一、二进制表示带符号数方法:
(1)最高位为1表示负数,最高位为0表示正数;
(2)哪一位是最高位取决于变量类型的字节数;
eg:在win32控制台应用程序中,int是32位,即是4字节的类型,当我们定义int i;那么这个i的最高位在从左数第三十一位(默认左一为第0位)。
二、原码补码反码:
(1)正数:原码补码反码是一样的;
(2)负数:负数的原码除了最高位为1,其余和正数一致,其反码除了最高位不变其余位为按位取反,补码为反码加1;
eg:对于win32平台:
22的原码为0000 0000 0000 0000 0000 0000 0001 0110
22的反码为0000 0000 0000 0000 0000 0000 0001 0110
22的补码为0000 0000 0000 0000 0000 0000 0001 0110
-22的原码为1000 0000 0000 0000 0000 0000 0001 0110
-22的反码为1111 1111 1111 1111 1111 1111 1110 1001
-22的补码为1111 1111 1111 1111 1111 1111 1110 1010
三、编程中所有数都用数的补码来表示为机器字:
(1)即22在机器中表示为0000 0000 0000 0000 0000 0000 0001 0110
(2) -22在机器中表示为1111 1111 1111 1111 1111 1111 1110 1010
四、实例:加减法带来的数据溢出问题
int 型数据最大值是2147483647
2147483646的二进制表示为 01111111 11111111 11111111 11111110
+6 00000000 00000000 00000000 00000110
结果 10000000 00000000 00000000 00000100
最高位除外,取反 11111111 11111111 11111111 11111011 (-2147483643)
补码(+1) 11111111 11111111 11111111 11111100 (-2147483644)
得出-1073741822