本节内容紧接上节,解决红色字体遗留问题。本节所有例子运行环境: 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].北京:清华大学出版社.

最新文章

  1. BLE 蓝牙协议栈开发
  2. css3在不同型号手机浏览器上的兼容一览表
  3. BZOJ 1029 &amp; 丝帛贪心
  4. AngularJS 之iOS 移动 APP 混合开发(原生+JS)
  5. Contoso 大学 - 4 - 创建更加复杂的数据模型
  6. winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)
  7. 优秀的弹窗插件 jquery.lightbox_me.js
  8. jsp servelet
  9. 把第三方的exe程序嵌入C#界面上
  10. null的小扩展
  11. 安装pipenv
  12. BootStrap插件
  13. 初学C的感想
  14. gradle 的jar下载到哪里了
  15. Maven SSH三大框架整合的加载流程
  16. WPF双向数据绑定总结
  17. mysql服务启动、停止、重启
  18. 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息
  19. Javascript 身份证号获得出生日期、获得性别、检查身份证号码
  20. jQuery Sizzle选择器(三)

热门文章

  1. Java的类锁、对象锁和方法锁
  2. python进程/线程/协程
  3. &lt;学习笔记 之 JQuery 基础语法&gt;
  4. 设计模式(Java语言)- 原型模式
  5. FastDFS文件服务器安装指南附安装包和自启动(看此篇就够了)
  6. 线段树 I - Transformation 加乘优先级
  7. 你应该知道的Vue高级特性
  8. Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
  9. QTreeWidget更新后保存节点的展开状态
  10. [hdu5199]统计数据的水题