龙空技术网

为什么char类型的数值范围是-128~127?

贵子的码头 143

前言:

目前同学们对“c语言中int和char型取值范围”可能比较看重,同学们都需要了解一些“c语言中int和char型取值范围”的相关资讯。那么小编也在网上收集了一些有关“c语言中int和char型取值范围””的相关内容,希望看官们能喜欢,看官们一起来了解一下吧!

本文针对x86架构体系而言

----------------------------------------

我们知道在c语言中,char类型是8位二进制的有符号类型,最高位为符号位,剩下的7位表示数值,而7位能表示的最大值为127,所以第一直觉是char类型的范围应该是-127~+127。但如果是-127~+127的话,那0就有两种表示了:

假如用源码表示0的话,二进制就是:0000 0000 和1000 0000, 也就是有正零,负零,有点诧异,还有点浪费空间...

那能不能用其中的一个0来表示-128呢?当然可以!而且必须用二进制1000 0000来表示(0000 0000就表示0了,天时地利人和)

这就有了-128的一席之地了:

0000 0001    10000 0000    01000 0000   -1281000 0001   -11000 0002   -2

但是看看这个坑占的,简直太突兀了,还是不要-128算了!而且如果-1>-2,那么他们映射的二进制1000 0001 也应该自然地大于 1000 0002,这样比较才是效率最高的,而不需要更高一层的定义。

别急别急,如果用补码,那正负的范围值就如丝般顺滑了(论补码的妙哉,哈哈):

注:有符号整数X,如果值大于等于0,则补码就是原码,如果小于0,则为2^n + X

0000 0001    10000 0000    01000 0000   -1281000 0001   -127.........1111 1111   -1

重新排列一下,就更符合自觉,更直观了,而且我们发现有符号无符号整数的二进制是一样的,关键就在于上层语言怎么解释了,比如1111 1111可以是255,也可以是-1。所以有无符号,纯粹就是上层语言怎么定义了。

0000 0000    00000 0001    1...0111 1111    1271000 0000    -1281000 0001    -127....1111 1111   -1

其他short, int,long long一样一样的,公式为:-2^(n-1) ~ +2^(n-1) - 1

标签: #c语言中int和char型取值范围