【C++】常见易犯错误之数值类型取值溢出与截断(2)
2024-10-05 22:30:31
本节内容紧接上节,解决红色字体遗留问题。本节所有例子运行环境: win10 + VS2015 + X64 + debug
在上节例子中,查看变量 c 、d 、d+1 的类型。
//// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h"
#include <iostream>
#include <iostream>
#include <cstddef>
#include <typeinfo> int main() {
system("color 3f");
short int a = ;
short b = ;
int c = a + b;
short d = a + b;
printf("c: %d: Dec: %d; Hex: %x; size: %d;\n",c, c, c, sizeof(c));
printf("d: %d: Dec: %d; Hex: %x; size: %d\n",d, d, d, sizeof(d));
printf("d+1: %d: Dec: %d; Hex: %x; size: %d\n", d+, d + , d + , sizeof(d + ));
std::cout << "type c: " << typeid(c).name() << "\n"
<< "type a+b: " << typeid(a+b).name() << "\n"
<< "type d: " << typeid(d).name() << "\n"
<< "type d+1: " << typeid(d+).name() << "\n" << std::endl; system("pause");
return ;
}
运行结果:
"a + b" 在运算时,由于a和b是short int 型,先转换为int(注意这是无条件转换,因为short、char等运算时,都先转换成int,即使是两个同类型的char/short运算,也要转换成 int 型),具体为什么可点击这里或者参考[2] P31,故 a+b 运算结束后为 int 型。同理,“d + 1”运算的结果也是 int 型。 “c = a + b” 则是由于int型的“a + b”赋值给 int 型的c,所以 c为 int 型。由于“a + b”是 int 型,但是需要赋值给取值范围更小的 short 型的 d,有可能发生截断,最后 d 的数据类型依然是 short 型,所占字节数为 2,但是在内存中依然使用32位来表示 d 。进一步做以下实验来说明这种情况:
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <iostream>
#include <cstddef>
#include <typeinfo> int main() {
system("color 3f");
short m = ;
printf("m: %d: Dec: %d; Hex: %x; size: %d;\n", m, m, m, sizeof(m));
short n = ;
printf("n: %d: Dec: %d; Hex: %x; size: %d;\n", n, n, n, sizeof(n));
std::cout << "\n";
system("pause");
return ;
}
实验结果:
当发生溢出时,依然用32位来表示两个字节的short。
参考文献
[1]C++数据溢出(上溢和下溢). http://c.biancheng.net/view/1332.html
[2] 谭浩强.C++程序设计[M].北京:清华大学出版社.
最新文章
- BLE 蓝牙协议栈开发
- css3在不同型号手机浏览器上的兼容一览表
- BZOJ 1029 &; 丝帛贪心
- AngularJS 之iOS 移动 APP 混合开发(原生+JS)
- Contoso 大学 - 4 - 创建更加复杂的数据模型
- winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)
- 优秀的弹窗插件 jquery.lightbox_me.js
- jsp servelet
- 把第三方的exe程序嵌入C#界面上
- null的小扩展
- 安装pipenv
- BootStrap插件
- 初学C的感想
- gradle 的jar下载到哪里了
- Maven SSH三大框架整合的加载流程
- WPF双向数据绑定总结
- mysql服务启动、停止、重启
- 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息
- Javascript 身份证号获得出生日期、获得性别、检查身份证号码
- jQuery Sizzle选择器(三)
热门文章
- Java的类锁、对象锁和方法锁
- python进程/线程/协程
- <;学习笔记 之 JQuery 基础语法>;
- 设计模式(Java语言)- 原型模式
- FastDFS文件服务器安装指南附安装包和自启动(看此篇就够了)
- 线段树 I - Transformation 加乘优先级
- 你应该知道的Vue高级特性
- Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
- QTreeWidget更新后保存节点的展开状态
- [hdu5199]统计数据的水题