int_32的最大值与最小值(C/C++)
INT_32的最小值
十进制表示为$-2147483648$,转化为二进制:$1000 0000 0000 0000 0000 0000 0000 0000$。
第一位$1$既是符号位,也是数值位:$-2_31 = 2,147,483,648$。
INT_32的最大值
十进制表示为$2147483647$,转化为二进制:$0111 1111 1111 1111 1111 1111 1111 1111$。
$2147483647 = 2_{30} + 2_{29} + 2_{28} + ... + 2_3 + 2_2 + 2_1 + 2_0$。
【注意:INT_32中最小值(负数)的绝对值比最大值(正数)的绝对值大1。】
计算机中的原码、反码与补码
在计算机系统中,数字都是以二进制补码的形式进行存储的。
(1)正数的原码、反码、补码保持一致。
(2)负数的原码,第一位为符号位(0表示正数,1表示负数)。
反码:符号位不变,后续各位取反。
补码:符号位不变,在反码的基础上加1(最后一位)。
几个特殊的补码
+0的补码:$0000 0000 0000 0000 0000 0000 0000 0000$
-0的补码:
原码 | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
反码 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 |
补码 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
即+0和-0的值在计算机系统是一致的。
0取反的结果:
0的原码 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 |
~0(按位取反) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 |
~0转化为十进制 | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0001 |
即~0 = -1。
按位移动
以下是在GCC下验证的结果,不同的编译器结果可能不一样。
按位左移:对于有符号数,符号位保持不变,其它位是逻辑左移。对于无符号数,所有位都是逻辑左移。
按位右移:对于有符号数,符号位保持不变,其它位是逻辑左移。对于无符号数,所有位都是逻辑左移。
-9(原码) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 1001 |
-9(反码) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0110 |
-9(补码) | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 0111 |
右移1位 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1111 | 1011 |
输出(反码) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0100 |
输出(补码) | 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0101 |
十进制输出:-5。
参考资料:
https://blog.csdn.net/ccozkf/article/details/104061067
Min是清明的茗