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

posted @ 2020-12-29 14:53  箐茗  阅读(3415)  评论(0编辑  收藏  举报