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

【C++】常见易犯错误之数值类型取值溢出与截断(2)的更多相关文章

  1. 【C++】常见易犯错误之数值类型取值溢出与截断(3)

    0.  前言 本节是“[C++]常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出. 1. 相关知识 (1) 浮点型数据取值范围如下: 单精度型 float 3.4 * 1 ...

  2. 【C++】常见易犯错误之数值类型取值溢出与截断(1)

    1. 数据类型数值范围溢出 如标题所述,该错误出现的原因是由于变量的值超出该数据类型取值范围而导致的错误. 例题如下: (IDE环境:C-Free,编译器为mingw5,如下图) # include ...

  3. 编程中易犯错误汇总:一个综合案例.md

    # 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...

  4. [golang 易犯错误] golang 局部变量初始化:=的陷阱

    我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便.但是,这也是易犯错误的地方之一.特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋 ...

  5. java代码书写易犯错误

    java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...

  6. 带符号的char类型取值范围为什么是-128——127

    以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...

  7. byte类型取值范围以及溢出具体解释

    例1: public class test { public static void main(String[] args) { byte a = 127 ; a = (byte)(a+3) ; Sy ...

  8. signed char类型取值范围计算

    在C语言程序中,给定一个类型,如何计算这个类型变量的取值范围呢?比如有一个字符型变量定义如下: signed char c: 这个字符变量c的取值范围是[-128,127],是计算出来的呢? 假设字符 ...

  9. Java开发者易犯错误Top10

    本文总结了Java开发者经常会犯的前十种错误列表. Top1. 数组转换为数组列表 将数组转换为数组列表,开发者经常会这样做: List<String> list = Arrays.asL ...

随机推荐

  1. USACO Training Section 1.1 Your Ride Is Here

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...

  2. 一个简单的wed服务器SHTTPD(7)———— SHTTPD内容类型的实现

    //start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...

  3. 跟哥一起学Python(1) - python简介

    01—写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...

  4. 《Docker从入门到跑路》之多阶段构建

    多阶段构建就是在一个Dokcerfile中定义多个FROM,每个FROM都可以使用不同的基础镜像,并表示开始一个新的构建阶段,我们可以很方便的将一个阶段的文件复制到另外一个阶段中,在最终的阶段保存你需 ...

  5. libevent(九)bufferevent

    bufferevent,带buffer的event struct bufferevent { struct event_base *ev_base; const struct bufferevent_ ...

  6. django开发最完美手机购物商城APP带前后端源码

    后端和数据接口,全采用django开发 从0到大神的进阶之路 一句话,放弃单文件引用vue.js练手的学习方式 马上从vue-cli4练手,要不然,学几年,你也不懂组件式开发,不懂VUEX,不懂路由, ...

  7. Numpy-np.random.normal()正态分布

    X ~ :随机变量X的取值和其对应的概率值P(X = ) 满足正态分布(高斯函数) 很多随机现象可以用正态分布描述或者近似描述 某些概率分布可以用正态分布近似计算 正态分布(又称高斯分布)的概率密度函 ...

  8. linux centos7搭建mysql-5.7.29

    1. 下载mysql 1.1  下载地址 https://downloads.mysql.com/archives/community/ 1.2  版本选择 2. 管理组及目录权限 2.1  解压my ...

  9. [hdu5411 CRB and Puzzle]DP,矩阵快速幂

    题意:给一个有向图,从任意点开始,最多走m步,求形成的图案总数. 思路:令dp[i][j]表示走j步最后到达i的方法数,则dp[i][j]=∑dp[k][j-1],其中k表示可以直接到达i的点,答案= ...

  10. [hdu2087]kmp水题

    题意:求模板串在文本串中出现的次数(位置无交叉).只需在找到的时候把模板串指针归0即可. #pragma comment(linker, "/STACK:10240000,10240000& ...