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

news/2025/1/31 6:38:10/

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 <iostream>
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++服务器


http://www.ppmy.cn/news/1009251.html

相关文章

【云原生】Docker-Compose全方面学习

目录 1.compose简介 Compose V2 2.compose安装与下载 二进制包 PIP 安装 bash 补全命令 卸载 3.docker compose管理命令 命令对象与格式 命令选项 命令使用说明 1.compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可…

k8s(七) 叩丁狼 service Ingress

负责东西流量&#xff08;同层级/内部服务网络通信&#xff09;的通信 service的定义 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议&#xff0c;支持 TCP、…

各省绿色创新效率原始数据+测算(2020-2021)

该数据集是一个分析中国各城市宗族文化的工具变量。数据包括第1大姓氏、第2大姓氏、第3大姓氏、宗族文化强度。根据2005年全国1%的人口调查数据计算。其中第1大姓氏第一大姓人口数/总人口数&#xff0c;宗族文化强度(第一大姓人口数第二大姓人口数第三大姓人口数)/总人口数。它…

CNN成长路:从AlexNet到EfficientNet(02)

一、说明 在~10年的深度学习中&#xff0c;进步是多么迅速&#xff01;早在 2012 年&#xff0c;Alexnet 在 ImageNet 上的准确率就达到了 63.3% 的 Top-1。现在&#xff0c;我们超过90%的EfficientNet架构和师生训练&#xff08;teacher-student&#xff09;。 二、第一阶段 …

链接过程(4/13)

在一个 C 项目的编译中&#xff0c;编译器以 C 源文件为单位&#xff0c;将一个个 C 文件翻译成对应的目标文件。生成的每一个目标文件都是由代码段、数据段、BSS 段、符号表等 section 组成的。这些 section 从目标文件的零偏移地址开始按照顺序依次排放&#xff0c;每个段中的…

【工具使用】git基础操作1

目录 一.拉取git代码1.首次拉取命令2.使用图形化拉取代码3.Idea 开发工具拉取代码 二.查看当前状态1.查看在你上次提交之后是否有对文件进行再次修改 三.创建分支3.1.创建分支3.2.创建分支并切换至分支3.3.提交分支至远程仓 远程没有自动创建 四.查看分支4.1.查看本地分支 当前…

解决vue3+echarts关于无法获取dom宽度和高度的问题

解决vue3echarts关于无法获取dom宽度和高度的问题 近期写vue3项目&#xff0c;很多地方都用到了echarts&#xff0c;刚开始写的时候&#xff0c;发现图一直出不来&#xff0c;报错/报警内容一般有两项&#xff1a; Uncaught (in promise) Error: Initialize failed: invalid …

C#设计模式之---单例模式

单例模式&#xff08;Singleton&#xff09; 单例模式&#xff0c;属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例。 1&#xff09;普通单例模式 using System; namespace SingletonPattern {/// /// 单例模式(非线程安全)/// …