zoukankan      html  css  js  c++  java
  • 【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
    ", fTest1, fTest1, fTest1, sizeof(fTest1));
        printf("fTest2:   %d:   Dec: %d;  Hex: %x;  size: %d
    ", fTest2, fTest2, fTest2, sizeof(fTest2));
        printf("fTest3:   %d:   Dec: %d;  Hex: %x;  size: %d
    ", fTest3, fTest3, fTest3, sizeof(fTest3));
        //std::cout << fTest1 << std::endl;
    
        system("pause");
        return 0;
    }

    运行结果:

     

     

    在这里,出现了两个问题:

    (1) fTest2 与 fTest3 出现了溢出;

    (2)  fTest2 与 fTest3 溢出后,并没有使用多余的位来表示,“【C++】常见易犯错误之数值类型取值溢出与截断(3)”中提到,short 型溢出使用多余位来表示;但这里显然没有出现这种情况。

    (2) 尚未解决,标红

    参考文献

    [1] 谭浩强.C++程序设计[M].北京:清华大学出版社,P18.

    [2] 浮点数转二进制与浮点数据在计算机中的表示. https://blog.csdn.net/csdn1829/article/details/79376073.

  • 相关阅读:
    vue实现左右两列竖直分别滑动,且双向关联的选项卡(一)
    根据对象的某个字段(值为数字)排序
    如何将data中字符传的换行正常显示
    HBase集群搭建部分配置
    YARN详解
    常用查询函数
    分桶表
    hive分区表
    xsync分发脚本
    ssh免密登录
  • 原文地址:https://www.cnblogs.com/chen-hw/p/11839603.html
Copyright © 2011-2022 走看看