C语言中取值范围的算法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最小的负数不是全1的那个(那是-1),而是1000 0000 0000 0000

为了不出现+0,-0两个0,C语言规定这个值是该类型最小的负数。

0 is 0000 0000 0000 0000

1 is 0000 0000 0000 0001

-1 is 1111 1111 1111 1111

-2 is 1111 1111 1111 1110

32767 is 0111 1111 1111 1111

-32768 is 1000 0000 0000 0000

-32767 is 1000 0000 0000 0001

32位服务器,各类型所占字节:test.c

short int 2字节

unsigned short int 2字节

int 4字节

unsigned int 4字节

long int 8字节

unsigned long int 8字节

char 1字节

unsigned char 1字节

float 4字节

double 8字节

long double 16字节

C语言中int的取值范围是怎么算出来的

这得从二进制的原码说起:

如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767 最小为1111111111111111=-2的15次方减1=-32767

此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0

所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。

但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。

到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。

所以,补码系统中,范围是-23768~32767。

因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1

相关文档
最新文档