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)的更多相关文章

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

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

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

    本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...

  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. 数学--数论-- HDU -- 2854 Central Meridian Number (暴力打表)

    A Central Meridian (ACM) Number N is a positive integer satisfies that given two positive integers A ...

  2. 题目分享V

    题意:现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k(k可以是任意整数,每次不一定相同)现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话Yes,否则No. 分 ...

  3. IP 基础知识全家桶,45 张图一套带走

    前言 前段时间,有读者希望我写一篇关于 IP 分类地址.子网划分等的文章,他反馈常常混淆,摸不着头脑. 那么,说来就来!而且要盘就盘全一点,顺便挑战下小林的图解功力,所以就来个 IP 基础知识全家桶. ...

  4. 数据库——数据库SQL语句大全,最常用的SQL语句

    检索数据 检索单个列: SELECT pname FROM product 检索多个列: SELECT pname,market_price,is_hot FROM product 检索所有列: SE ...

  5. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  6. Linux暂时提升非root用户的权限

    sudo 用于提升非root用户的某些命令执行权限 1,使用root用户,复制vim /etc/sudoers 文件的第91行修改为,想提升的用户名称 root ALL=(ALL) ALL admin ...

  7. spring mvc 中使用session

    举例:用户登录成功之后,把用户对象放置到session中 第一步,用户登录成功之后把用户对象首先放到Model中 第二步,要在控制器上加SessionAttributes注解,把放到model中的对象 ...

  8. Spring源码阅读 之 bean的注册

    在前面我们已经学习了配置的加载,读取,解析.现在我们已经能够将一份配置转变成对应的一个个beandefinition了,我们知道Spring是一个IOC的容器,那么我们如何将这个一个个beandefi ...

  9. Code Review 常见的5个错误模式

    原作者:Trisha Gee Code Review 的时候,每个人都会关心最佳实践,但最坏的实践有时可能会更有启示意义. Code Review是研发团队必不可少的,但并不总是正确的.这篇文章指出了 ...

  10. Qt5.5 connection firebird on Linux Centos7.2 or windows

    windows c++ 项目移植到 linux,原项目需要连接 Firebird数据库. google 后知道 linux qt connection Firebird 有两种方法: 1.ibpp c ...