C++中选择正确的数据类型以免发生溢出错误

C++中选择正确的数据类型以免发生溢出错误

诸如 short、int、long、unsigned short、unsigned int、unsigned long 等数据类型的容量有限,如果算术运算的结果超出了选定数据类型的上限,将导致溢出。
就拿 unsigned short 来说吧,它占用 16 位内存,因此取值范围为 0~65535。 usigned short 变量的值为 65535 后,如果再加 1,将导致溢出,结果为 0。这很像汽车的里程表,如果它只支持 5 位数字,则里程超过 99999 公里后,里程表将发生机械溢出。
在这种情况下,将计数器的变量类型指定为 unsigned short 不合适。要支持大于 65535 的数字,程序员应使用数据类型 unsigned int。
数据类型 signed short 的取值范围为-32768~32768,如果这种变量的值已经是 32768,则将其加 1 的结果为最小的负数—这取决于编译器。
以下的示例程序演示了执行算术运算时可能不小心导致的溢出错误:

#include 
using namespace std;

int main()
{
    unsigned short uShortValue = 65535;
    cout << "Incrementing unsigned short " << uShortValue << " gives: ";
    cout << ++uShortValue << endl;

    short signedShort = 32767;
    cout << "Incrementing signed short " << signedShort << " gives: ";
    cout << ++signedShort << endl;

    return 0;
}

输出:

Incrementing unsigned short 65535 gives: 0
Incrementing signed short 32767 gives: -32768

分析:

上述输出表明,无意的溢出导致应用程序的行为不可预测。在第 7 和 11 行,将已经分别为最大可能取值 65535 和 32767 的 unsigned short 变量和 signed short 变量加 1。输出表明,执行递增运算后发生了溢出, 导致 unsigned short 变量的值从 65535 变成了 0 , 而signed short 变量的值从 32767 变成了 -32768。
您做梦都想不到,递增运算竟然会导致变量的值减小,但发生溢出时,情况确实如此。如果使用一个 unsigned short 变量来指定要分配的内存量,则在您原本要分配 65356 字节内存时,实际上请求的却是
零字节。

注意:

示例代码中第 7 和 11 行的 ++uShortValue 和 ++signedShort 执行的是前缀递增运算,这种运算将在第 5 章详细介绍。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

你可能感兴趣的:(C++编程基础,c++)