当前位置: 首页 > article >正文

C# 整型、浮点型 数值范围原理分析

总目录


前言


一、整型、浮点型 数值范围列表

在这里插入图片描述
在这里插入图片描述

二、什么是大小、范围

在上面的列表中,每个数据类型都有自己的Range (范围) 和 Size (大小)。

1. 范围

范围好理解,就是对应数据类型的数据范围,如 sbtyte 的数据范围是 -128~127,超过该范围编译器会报错
在这里插入图片描述

2. 整型 大小

那么什么是大小呢? 大小和范围之间又有什么关系呢?

        static void Main(string[] args)
        {
            var n1 = sizeof(sbyte); // 1
            var n2 = sizeof(byte);  // 1
            var n3 = sizeof(short); // 2
            var n4 = sizeof(int);   // 4
            var n5 = sizeof(uint);  // 4
            var n6 = sizeof(long);  // 8
            var n7 = sizeof(ulong); // 8
            Console.WriteLine($"sbyte:{n1}|byte:{n2}|short:{n3}|int:{n4}|uint:{n5}|long:{n6}|ulong:{n7}");
            //输出:sbyte:1|byte:1|short:2|int:4|uint:4|long:8|ulong:8
        }

sizeof 运算符返回给定类型的变量所占用的字节数,由此可知各个数据类型所占用的字节数。
其中1个字节 有8个数据位(1byte=8bit)。

要理解数据的数据范围是怎么来的,我们就需要了解计算机如何表示这些数据?
计算机使用二进制(0 和 1)来表示所有数据。对于一个8位(1个字节)的数据类型,它可以表示28=256 种不同的状态。

1)byte 类型

byte 是一个 无符号 的 8 位整数类型,其取值范围是 0 到 255。

  • byte 没有符号位,所以它可以使用全部 8 位来表示数值
  • 二进制表示:
    • 最小值:0000 0000 表示 10进制 0
    • 最大值:1111 1111 表示 10进制 255
  • 因此byte的 数据范围:从 0 ~ 255

2)sbyte 类型

sbyte 是一个 带符号 的 8 位整数类型,其取值范围是 -128 到 127。

  • sbyte使用最高位(最左边的一位)作为符号位:
    • 如果符号位为 0,则该数字是正数。
    • 如果符号位为 1,则该数字是负数。
  • 正数的表示,对于正数,sbyte 使用剩下的 7 位来表示数值:
    • 00000000 表示 0
    • 00000001 表示 1
    • 01111111 表示 127
    • 这 7 位可以表示 2^7 = 128 种不同的正数状态(包括 0),因此正数范围是从 0 到 127。
  • 负数的表示,对于负数,sbyte 使用补码表示法
  • 具体来说,负数的补码表示 是通过对其绝对值的二进制表示按位取反(即 0 变 1,1 变 0),然后加 1 得到的。例如:
    • -1 的补码表示:1111 1111(对 0000 0001 按位取反得 1111 1110,再加 1 得 1111 1111)
    • -2 的补码表示:1111 1110(对 0000 0010 按位取反得 1111 1101,再加 1 得 1111 1110)
    • -128 的补码表示:1000 0000(对 1000 0000 按位取反得 01111111,再加 1 得 10000000)
    • 特别地,-128 是因为 10000000 这个二进制数只能表示 -128,而没有对应的正数 128。

以此类推,我们就知道 short,int ,uint,long 等数据类型的数据范围是如何来的。

3. 浮点型分析

        static void Main(string[] args)
        {
            var n1 = sizeof(float);   // 4
            var n2 = sizeof(double);  // 8
            var n3 = sizeof(decimal); // 16

            Console.WriteLine($"float:{n1}|double:{n2}|sizeof:{n3}");
            Console.WriteLine($"float 的范围{float.MinValue} - {float.MaxValue}");
            Console.WriteLine($"double 的范围{double.MinValue} - {double.MaxValue}");
            Console.WriteLine($"decimal 的范围{decimal.MinValue} - {decimal.MaxValue}");
            //输出:
            // float 的范围-3.4028235E+38 - 3.4028235E+38
            // double 的范围-1.7976931348623157E+308 - 1.7976931348623157E+308
            // decimal 的范围-79228162514264337593543950335 - 79228162514264337593543950335
        }

在这里插入图片描述

内部结构:

  • float 内部结构:遵循 IEEE 754 标准,使用 1 位符号位、8 位指数位和 23 位尾数位
    • 精度:大约6 - 9 位数字
  • double内部结构:遵循 IEEE 754 标准,使用 1 位符号位、11 位指数位和 52 位尾数位
    • 精度:大约15 - 17位数字
  • decimal内部结构:不是基于 IEEE 754 标准,而是专门为精确的小数运算设计,适用于金融和货币计算。
    • 精度:28-29位

适用场景:

  • float

    • 科学计算:如物理学模拟、图形处理等,对速度要求高,对精度要求相对较低的场合。
    • 游戏开发:如坐标计算、物理引擎等,需要快速运算但不需要极高精度的场景。
    • 一般用途:当需要表示小数且对精度要求不高时,float 是一个轻量级的选择。
  • double

    • 科学计算:如天文学、工程学等,对精度要求较高且涉及非常大或非常小数值的场合。
    • 金融计算:虽然 decimal 更适合金融应用,但在某些情况下,double 也可以用于非货币相关的高精度计算。
    • 高性能计算:如数值分析、机器学习等,需要高精度和较大范围的数据表示。
  • decimal

    • 金融和货币计算:如银行系统、会计软件等,要求绝对精确的小数运算,避免舍入误差。
    • 商业应用:如销售系统、库存管理等,涉及金额和价格的计算,确保结果准确无误。
    • 任何需要高精度小数运算的地方:如税收计算、利率计算等,确保不会因为浮点数的舍入问题导致错误。
  • 选择指南

    • 如果需要高速度和较小内存占用,并且可以接受一定的精度损失,选择 float。
    • 如果需要更高的精度和更大的数值范围,但仍然可以接受浮点数的舍入误差,选择 double。
    • 如果需要绝对精确的小数运算,特别是涉及货币和金融应用,选择 decimal。

结语

回到目录页:C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
sizeof 运算符 - 确定给定类型的内存需求


http://www.kler.cn/a/466310.html

相关文章:

  • 软件工程期末大复习(六)面向对象分析
  • Vue3实现PDF在线预览功能
  • Rabbitmq 具体怎么做到削峰的,是丢弃部分消费吗,有的实际场景是不允许丢弃
  • AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义
  • 计算机网络基础(7)中科大郑铨老师笔记
  • HTML——75. 内联框架
  • Vue中常用指令
  • antdesignvue vue3全局loading
  • JavaScript的数据类型及检测方式
  • git时常混淆的操作的笔记
  • 低代码开发深度剖析:JNPF 如何引领变革
  • 数字PWM直流调速系统设计(论文+源码)
  • Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
  • 常见的九种二极管
  • 代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
  • SQLite简介:轻量级数据库入门
  • 57.在 Vue 3 中使用 OpenLayers 点击选择 Feature 设置特定颜色
  • 断舍离:通往心灵自由的五级阶梯
  • JavaScript系列(4)--数值类型专题
  • js获取下拉单选框的值和显示的值
  • springboot整合Quartz实现定时任务
  • 趣味编程:心形曲线
  • Linux环境(CentOs7) 安装 Node环境
  • 最近学习shader的一些总结
  • npm ERR! ECONNRESET 解决方法
  • Celeborn Spark 集成最新进展