1. 编程学习网 > 编程教程 > C语言教程 > C语言各种数据类型的范围

C语言各种数据类型的范围

TIPS:

  如果关于整型范围的分析暂时看不懂,请先记住sizeof的使用和各种整型变量的取值范围即可,不影响对C语言的使用。到时候回过头再来看取值范围的原理分析。


  我们先暂时不要讨论32个二进制,我们讨论一个稍微小一点的,3个二进制。它能表示多大范围的数值呢?

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)的运算结果。

3+(-3)

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

  让我们多算几个,你会发现仍然是正确的。

calc

  你肯定很好奇,怎样求一个正数对应的负数的二进制表示呢?


  1. 先写出这个正数的二进制。
  2. 从二进制的右边开始,遇到第一个1之前,全都填0。
  3. 遇到第一个1之后,把1填下来。
  4. 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

联系我们

在线咨询:点击这里给我发消息

咨询电话:400-998-2681

工作时间:7*24小时无休