数据范围和边界[C++]

 

1 基本概念

  • 位 (bit):代表0或1, 比如 0000,代表4位,00001111代表8位。位是内存的基本单元。
  • 字节 (byte):通常1B=8bit (字节的含义依赖于系统实现)。字节是描述计算机内存量的度量单位。
  • 字长(word size):CPU在单位时间内能一次处理的二进制数的位数。
  • 32位CPU:该CPU在单位时间内能一次处理的二进制数的位数为32位,即一次处理4个字节。
  • 64位CPU:该CPU在单位时间内能一次处理的二进制数的位数为64位,即一次处理8个字节。   
  • 32位操作系统:为了32位电脑(32位CPU)而设计的操作系统,同时需要安装32位软件以发挥32位(x86)的最佳性能。
  • 64位操作系统:为了64位电脑(64位CPU)而设计的操作系统,同时需要安装64位软件以发挥64位(x64)的最佳性能。

64位系统和32位系统有什么区别? 

      1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存;
      2、64位CPU一次可提取64位数据,比32位提高一倍。理论上性能会提升1倍,但要以64bit操作系统+64bit软件为基础。 

2 数据范围

 不同的平台上对不同数据类型分配的字节数是不同的。
      个人对平台的理解是CPU+OS+Compiler,是因为: 
      1、64位机器也可以装32位系统(x64装XP); 
      2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的); 
      3、即使是32位的编译器也可以弄出64位的integer来(int64)。 
      以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。 
      虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。 
      理论上来讲数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。

常用数据类型对应字节数
  可用如sizeof(char),sizeof(char*)等得出

 32位编译器:

      char :1个字节
      char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。64位编译器同理)
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   4个字节
      long long:  8个字节
      unsigned long:  4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   8个字节
      long long:  8个字节
      unsigned long:  8个字节

3 边界值

  • int类型的最高位为符号位,若最高位为0, 则为非负数,若最高位为1,则为负数。
  • 32位系统中int类型占4个字节(C中int类型是32位的),范围是-2147483648~2147483647(-2^{31}~2^{31}-1):

      1、最大值为INT_MAX:2^{31}-1或者0x7FFFFFFF。
      2、最小值为INT_MIN:-2^{31}或者0x80000000。
      3、-1(int类型)在4个字节中的存储方式为0xFFFFFFFF。

            对于-2^{31}-2^{31}  =  -2^{31} + 0,-2^{31}是负数从小到大排序的第0位;
            对于-1: -1 = -2^{31} + 2^{31}-1,-1是负数从小到大排序的第2^{31}-1位。

  • 注意,比较有趣的是:

INT_MAX + 1 = INT_MIN

INT_MIN - 1 = INT_MAX

abs(INT_MIN) = INT_MIN

INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

  • 所有超过限值的数,都会出现溢出,使程序出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。

      1、最轻微的上溢是INT_MAX + 1:结果是 INT_MIN。
      2、最严重的上溢是INT_MAX + INT_MAX:结果是-2。
      3、最轻微的下溢是INT_MIN - 1:结果是INT_MAX。
      4、最严重的下溢是INT_MIN + INT_MIN:结果是0 。

 

参考文献

[1] 32位和64位的区别. Bird鸟人.

[2] 32位和64位系统区别及int字节数. weixin_30432007.

[3] 32位和64位系统下 int、char、long、double所占的内存. single6.

[4] C++ INT_MAX、INT_MIN、0x80000000以及int中负数的存储. boom!!!.

[5] C/C++整型上下限INT_MAX INT_MIN及其运算. zhusf16.

[6] INT_MAX和INT_MIN注意事项. 对称.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贫道绝缘子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值