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 运算符 - 确定给定类型的内存需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路: 一、项目背景 二、功能分析 查询功能流程图: 管理功能流程图: 三、设计 四、实现 代码实现: 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树(打印) 建立右兄弟…

springboot参数注解

在Spring Boot中,创建RESTful API时,通常会使用Spring MVC提供的注解来声明请求参数。以下是一些常用的注解及其用途: 1. RequestBody 用途:用于将HTTP请求的body部分绑定到方法参数上,通常用于接收JSON或XML格式的数…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…

docker内外如何实现ROS通信

写在前面 在一台电脑上装有docker&#xff0c;docker内外均装有ROS系统&#xff0c;现在想要实现docker内外的ROS通信&#xff0c;怎么办呢&#xff1f; 首先&#xff0c;因为是同一台电脑的docker内外&#xff0c;所以IP本身是互通的&#xff0c;不需要在/etc/hosts中添加IP…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

web3与AI结合-Sahara AI 项目介绍

背景介绍 Sahara AI 于 2023 年创立&#xff0c;是一个 "区块链AI" 领域的项目。其项目愿景是&#xff0c;利用区块链和隐私技术将现有的 AI 商业模式去中心化&#xff0c;打造公平、透明、低门槛的 “协作 AI 经济” 体系&#xff0c;旨在重构新的利益分配机制以及…

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…

全局变量(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

耗时一天,我用AI开发了AI小程序

小码哥从事前后端开发近十年&#xff0c;但是随着技术的更新迭代&#xff0c;有时候没有时间和精力去优化UI、实现一些前后端功能&#xff0c;以及解决一些bug。特别是我想开发小码哥AI的移动端&#xff0c;但觉得自己没有那么多时间去研究移动端了&#xff0c;准备放弃了&…

细说STM32F407单片机以轮询方式读写外部SRAM的方法

目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC &#xff08;1&#xff09; 模式设置 &#xff08;2&#xff09; Bank 1子区3参数设置 1) NOR/PSRAM control组&#xff0c;子区控制参数 2) NOR/PSRAM timi…

LLM prompt提示构造案例:语音回复内容;o1思维链

1、语音回复内容 目的&#xff1a; 语音聊天助手的prompt&#xff0c;让大模型来引导聊天内容&#xff0c;简短和友好&#xff0c;从而文字转语音时候也比较高效。 ## 角色设定与交互规则 ### 基本角色 你是用户的好朋友. 你的回答将通过逼真的文字转语音技术阅读. ### 回答规则…

【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】

将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…

非一般的小数:小数的概念新解、小数分类、浮点数的存储

非一般的小数&#xff1a;小数的概念新解、小数分类、浮点数的存储 一、小数的概念二、小数的分类1&#xff0e;有限小数、无限循环小数、无限不循环小数2&#xff0e;纯小数、带小数3&#xff0e;定点数、浮点数 三、浮点数的存储 一、小数的概念 这还用解释吗&#xff1f;小…

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3&#xff0c;不同的API结果无论是访问URL还是使用etcdctl进行通信&#xff0c;都会导致问题&#xff0c;例如使用etcdctl和v3进行通信&#xff0c;如果没有实名ETCDCTL_API3指定API版本会直接…

小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式

这一节目标是实现底部推荐商品的结构和样式&#xff0c;由于这里要求横向滚动&#xff0c;所以需要使用上节介绍的 scroll-view 功能&#xff0c;并使用 scroll-x 属性支持横向滚动&#xff0c;推荐商品区域中的每一个商品是一个单独的 view&#xff0c;每个view 中需要写三个组…

JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

1&#xff0e;JDK、JRE、JVM三者的关系 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…