C语言各种数据类型的范围
TIPS:
如果关于整型范围的分析暂时看不懂,请先记住sizeof的使用和各种整型变量的取值范围即可,不影响对C语言的使用。到时候回过头再来看取值范围的原理分析。
我们先暂时不要讨论32个二进制,我们讨论一个稍微小一点的,3个二进制。它能表示多大范围的数值呢?

请不要忘记给0位置了哦。那么32个二进制呢?
2 x 2 x 2 x 2 x 2 ...(32个) x 2 x 2 = 2的32次方 = 4,294,967,296
int的数值范围为:0 到 4,294,967,295。我们作对了吗?
快了,但是不全对。我们来看下面这个代码。

对的,你肯定意识到了,负数怎么办?那我们需要拿出一个位来表示符号。表示这个数据是正数还是负数。在IEEE标准中,这个符号位存在于二进制的最高位。同样的,我们来看三位二进制的情况。

加上符号之后,现在取值范围变为-4到3了。红框中的为最高位,最高位为1的表示负数。你可能会觉得有点奇怪,为什么3的二进制是011,而-3却是101呢?如果简单的加一个符号位,为什么不用111呢?那我们看看3+(-3)的运算结果。

可以看到,如果用上图中的101表示-3,那么3+(-3)的结果是正确的。和的结果为1000,但是我们只用3个二进制来表示数值。所以第四位被被抛弃了,也就是我们常说的溢出。但是,这个溢出却让我们得到了正确的结果000。而用111来表示-3,却无法得到正确的结果。
让我们多算几个,你会发现仍然是正确的。

你肯定很好奇,怎样求一个正数对应的负数的二进制表示呢?
- 先写出这个正数的二进制。
- 从二进制的右边开始,遇到第一个1之前,全都填0。
- 遇到第一个1之后,把1填下来。
- 1之后的全部取反。

和上图的数据对照一下看看,确实是一致的。这种负数的表示法,既通过最高位,区别了正数和负数。并且,巧妙地应用了溢出,计算结果也是正确的。因此,既然能计算负数了,那么所有的减法,都能通过加一个负数来实现。这样,使得计算机电路得到了简化。这种表示负数的方法,被称为补码。一个正整数的补码是它本身,负数的补码,通过刚刚的步骤可以求得。
最后,你肯定发现了整数4位,二进制为【100】,而负数4,在三位二进制表示中,也是【100】。这可咋办呢?既然最高位是符号位了,并且,负数4的运算结果也正确。我们上面已经算过关于-4的了。那我们就只能用【100】来表示-4了。因此,3位二进制可以表达的数值范围为【 +(2的二次方) ~ -(2的二次方 - 1) 】,也就是-4到+3。
终于可以回到最前面的问题了。各种整型变量的数值范围是多少?
| 类型 | sizeof大小 | 二进制位数 | 取值范围算式 | 取值范围 |
|---|---|---|---|---|
| short | 2 | 2x8 = 16位 | -【2的15次方】 ~ +【2的15次方 - 1】 | -32,768 ~ +32,767 |
| int | 4 | 4x8 = 32位 | -【2的31次方】 ~ +【2的31次方 - 1】 | -2,147,483,648 ~ + 2,147,483,647 |
| long | 4 | 4x8 = 32位 | -【2的31次方】 ~ +【2的31次方 - 1】 | -2,147,483,648 ~ + 2,147,483,647 |
| long long | 8 | 8x8 = 64位 | -【2的63次方】 ~ +【2的63次方 - 1】 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
次方数比位数少一,是因为最高位被用去做符号位了。
本文由IT教学网整理发布,转载请注明出处:http://www.itjx.com/jiaocheng/cyuyan/587.html
