为什么在字长为32的系统中,C语言int型变量存储的数 的范围是-2147483648~2147483647 在字长为32的系统中二进制原码最大值为 01111111111111111111111111111111 =231.1=2147483647 二进制原码最小值为 11111111111111111111111111111111 =-(231-1)=-2147483647 正0和负0: +0=0000.0000000000000000000000000000 -0=10000000.000000000000000000000000 所以,二进制原码表示时,范围是-2147483647~-0和0~ 2147483647,因为有两个零的存在,所以不同的数值个数一 共只有232.1个,比32位二进制能够提供的22个编码少1 个。但是计算机中采用二进制补码存储数据。正数编码不变, 从 00000000000000000000000000000000到 01111111111111111111111111111111
为什么在字长为 32 的系统中, C 语言 int 型变量存储的数 的范围是-2147483648~2147483647 在字长为 32 的系统中二进制原码最大值为 0111 1111 1111 1111 1111 1111 1111 1111 =2 31 -1=2147483647 二进制原码最小值为 1111 1111 1111 1111 1111 1111 1111 1111 =-(2 31 -1)=-2147483647 正 0 和负 0: +0=0000 0000 0000 0000 0000 0000 0000 0000 -0=1000 0000 0000 0000 0000 0000 0000 0000 所以,二进制原码表示时,范围是-2147483647~-0 和 0~ 2147483647,因为有两个零的存在,所以不同的数值个数一 共只有 2 32 -1 个,比 32 位二进制能够提供的 2 32 个编码少 1 个。但是计算机中采用二进制补码存储数据。正数编码不变, 从 0000 0000 0000 0000 0000 0000 0000 0000 到 0111 1111 1111 1111 1111 1111 1111 1111
补码依旧表示0到2147483647。 原码负数是从-2147483647到-0 11111111111111111111111111111111到 1000.0000000000000000000000000000 补码是从1D00000000000000000000000000000001到 00000000000000000000000000000000 从需要把除符号位以后的部分取反加1,即-2147483647的补 码为10.…30个.1。 也就是正0和负0的补码编码是一样的。但是,我们知道, 32位二进制数可以表示232个编码,而在补码中零的编码只 有一个,也就是补码中会比原码多一个编码出来,这个编码 就是10000000000000000000000000000000, 因为任何一 个原码都不可能在转成补码时变成1000000000000000 0000000000000000。所以,人为规定1000000000000000 0000000000000000这个补码编码为-2147483648。所以,补 码系统中,范围是-2147483648~-2147483647。 因此,实际上,32bits二进制的最小数确实是111111111111 11111111111111111111,只是二进制补码的最小值才是
补码依旧表示 0 到 2147483647。 原码负数是从-2147483647 到-0 1111 1111 1111 1111 1111 1111 1111 1111 到 1000 0000 0000 0000 0000 0000 0000 0000 补码是从 1000 00000 0000 00000 0000 0000 0000 0001 到 0000 0000 0000 0000 0000 0000 0000 0000 从需要把除符号位以后的部分取反加 1,即-2147483647 的补 码为 10…30 个…1。 也就是正 0 和负 0 的补码编码是一样的。但是,我们知道, 32 位二进制数可以表示 2 32 个编码,而在补码中零的编码只 有一个,也就是补码中会比原码多一个编码出来,这个编码 就是 1000 0000 0000 0000 0000 0000 0000 0000,因为任何一 个原码都不可能在转成补码时变成 1000 0000 0000 0000 0000 0000 0000 0000。所以,人为规定 1000 0000 0000 0000 0000 0000 0000 0000 这个补码编码为-2147483648。所以,补 码系统中,范围是--2147483648~-2147483647。 因此,实际上,32bits 二进制的最小数确实是 1111 1111 1111 1111 1111 1111 1111 1111,只是二进制补码的最小值才是
1000000000000000000000000000000,而111111111111 111山1111111111111111的补码是-1。 #include "stdio.h" /*int型变量取值范围为 -2147483648(2^31)2147483647(2^31-1)*/ main() { intj,i=2147483647; j=i+l; /*超过int型数的存储范围*/ printf("%d\n",i); printf("%d n"j), 运行结果为: 2147483647 -2147483648
1000 0000 0000 0000 0000 0000 0000 0000,而 1111 1111 1111 1111 1111 1111 1111 1111 的补码是-1。 #include "stdio.h" /*int 型变量取值范围为 -2147483648(2^31)~2147483647(2^31-1)*/ main() { int j,i=2147483647; j=i+1; /*超过 int 型数的存储范围*/ printf("%d\n",i); printf("%d\n",j); } 运行结果为: 2147483647 -2147483648