【C++】常见易犯错误之数值类型取值溢出与截断(3)
0. 前言
本节是“【C++】常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出。
1. 相关知识
(1) 浮点型数据取值范围如下:
| 单精度型 | float | 3.4 * 10^-38 ~ 3.4 * 10^38 |
| 双精度型 | double | 1.7 * 10^-308 ~ 1.7 * 10^308 |
| 长双精度型 | long double | 1.7 * 10^-308 ~ 1.7 * 10^308 |
C++并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数,各种C++编译系统根据自己的情况作出安排[1]。在VC6.0中,float、double、long double 分别占4,8,8个字节。
(2) 浮点数转换为二进制
浮点数分为整数部分和小数部分,整数部分按照“除二取余逆序书写”的法则将其转换为二进制写在浮点的左边,小数部分按照“乘二取整正序书写”的法则将其转换为二进制写在浮点的右边[2]。例子如下:

2. 浮点型取值范围溢出
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <iostream>
#include <cstddef>
#include <typeinfo> int main() {
system("color 3f");
float fTest1 = 3.4e33;
float fTest2 = 3.4e38;
float fTest3 = 3.4e39;
printf("fTest1: %d: Dec: %d; Hex: %x; size: %d\n", fTest1, fTest1, fTest1, sizeof(fTest1));
printf("fTest2: %d: Dec: %d; Hex: %x; size: %d\n", fTest2, fTest2, fTest2, sizeof(fTest2));
printf("fTest3: %d: Dec: %d; Hex: %x; size: %d\n", fTest3, fTest3, fTest3, sizeof(fTest3));
//std::cout << fTest1 << std::endl; system("pause");
return ;
}
运行结果:

在这里,出现了两个问题:
(1) fTest2 与 fTest3 出现了溢出;
(2) fTest2 与 fTest3 溢出后,并没有使用多余的位来表示,“【C++】常见易犯错误之数值类型取值溢出与截断(3)”中提到,short 型溢出使用多余位来表示;但这里显然没有出现这种情况。
(2) 尚未解决,标红
参考文献
[1] 谭浩强.C++程序设计[M].北京:清华大学出版社,P18.
[2] 浮点数转二进制与浮点数据在计算机中的表示. https://blog.csdn.net/csdn1829/article/details/79376073.
【C++】常见易犯错误之数值类型取值溢出与截断(3)的更多相关文章
- 【C++】常见易犯错误之数值类型取值溢出与截断(1)
1. 数据类型数值范围溢出 如标题所述,该错误出现的原因是由于变量的值超出该数据类型取值范围而导致的错误. 例题如下: (IDE环境:C-Free,编译器为mingw5,如下图) # include ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(2)
本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...
- 编程中易犯错误汇总:一个综合案例.md
# 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...
- [golang 易犯错误] golang 局部变量初始化:=的陷阱
我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便.但是,这也是易犯错误的地方之一.特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋 ...
- java代码书写易犯错误
java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...
- 带符号的char类型取值范围为什么是-128——127
以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...
- byte类型取值范围以及溢出具体解释
例1: public class test { public static void main(String[] args) { byte a = 127 ; a = (byte)(a+3) ; Sy ...
- signed char类型取值范围计算
在C语言程序中,给定一个类型,如何计算这个类型变量的取值范围呢?比如有一个字符型变量定义如下: signed char c: 这个字符变量c的取值范围是[-128,127],是计算出来的呢? 假设字符 ...
- Java开发者易犯错误Top10
本文总结了Java开发者经常会犯的前十种错误列表. Top1. 数组转换为数组列表 将数组转换为数组列表,开发者经常会这样做: List<String> list = Arrays.asL ...
随机推荐
- Linux下使用Rsync进行文件同步
数据备份方案 1.需要备份的文件目录有(原则上,只要运维人员写入或更改的数据都需要备份)./data,/etc/rc.local,/var/spool/cron/root等,根据不同都服务器做不同的调 ...
- 揭露.net培训结构软谋收钱踢学员的套路
本人以下文章全部真实,希望管理员能通过,给更多的.net学者一个警示,避免更多的.neter掉入泥坑. 本人小码农一枚,主要做.net方向,苦于进步无门,各种资料收集渠道受限,最后狠心花一个月工资报名 ...
- Spring Cloud 学习 之 Spring Cloud Eureka(概述)
Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 前述: 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务 ...
- RSA host key has changed
- 完了!CPU一味求快出事儿了!
自我介绍 我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴. 我所在的一号车间里,除了负责执行指令的我,还有负责取指令的小A,负责分析指令的小胖和负责结 ...
- 【Kafka】自定义分区策略
自定义分区策略 思路 Command+Option+shift+N 调出查询页面,找到producer包的Partitioner接口 Partitioner下有一个DefaultPartitioner ...
- [hdu4123]dfs区间化+RMQ
题意:给一个树编号0~n-1,一个数组a[i]为节点i在树上走的最大距离(不重复点),然后求最大的区间,使得区间最大差异小于某个值.dfs求出每个数组,同时区间化.枚举区间左边界,右边界同样递增,类似 ...
- vue 在main.js里使用vue实例
可以用 Vue.prototype 比如 Vue.prototype.$indicator.close(); 关闭正在加载的动画
- 使用GitHub的API实现文件上传--李渣渣(lizaza.cn)
最近搭建了一个自己的博客网站和一个在线图片格式转换工具,经常写博客的时候需要上传图片,在线转换工具也需要一定的空间来临时存放图片文件.服务器的存储空间又比较有限,于是就想着将图片存储的GitHub上, ...
- C#winform跨窗体传值和调用事件的办法
有三个窗体,分别是Main主窗体,Form1窗体1,From2窗体2,其中Main是主窗体,Form1窗体1是一个消息通知窗体,Form2窗体2主窗体的一个子窗体,程序启动时,消息框窗体1弹出,通过消 ...