为什么我不能传递一个大的值作为Int32

本文关键字:一个 Int32 不能 为什么 | 更新日期: 2023-09-27 18:08:09

我有一个数字:94,800,620,800

Float是4字节的数据类型。Int32也是4字节数据类型。

float f = 94800620800; // ok
Int32 t = 94800620800; // error

请解释这个问题。为什么我得到一个错误时使用Int32。为什么我可以将这个数字用于浮点数据类型,因为它们都是4字节数据类型。谢谢。

为什么我不能传递一个大的值作为Int32

因为您尝试分配的数字大于Int32类型的数字的最大可能值,该值恰好是2,147,483,647。需要注意的是,Single的最大值为3.402823 × 1038

Int32的最大值是2,147,483,647,小于94,800,620,800。

float的取值范围为:±1.5 × 10 - 45 ~±3.4 × 1038

还有,看看这个SO问题——在java中,当大小相同时,float和integer数据类型有什么区别?这是一个Java问题,但概念是相同的,并且有详细的差异解释,即使它们大小相同。

因为这个数字对于一个4字节的int来说太大了。像Int32这样的标量值有最小和最大限制(在这种情况下分别是-231和231 - 1),并且您根本不能存储超出此范围的值。

浮点数的存储方式是完全不同的,所以你不会因为巨大的值而遇到编译错误,只有在运行时可能出现的精度问题。

由于这些类型的内部表示。

float使用i,d ^ n之类的东西,其中i是整数部分,d是小数部分,n是指数(当然,以2为基数)。

通过这种方式,您可以在float中存储更大的数字,但在存储整型数字时,它不会像Int32那样精确。如果您尝试转换

float f = 94800620800; 

转换为一个大到足以存储其值的整型,它可能与初始值94800620800不同。

整数类型是精确表示,而浮点数是有效数字和指数的组合。

浮点数wiki页面解释了这是如何工作的

也许你应该阅读错误信息?;)

Error   Integral constant is too large

32位整型的最大值为2,147,483,647

而浮点数

则有效,因为它存储尾数和指数,而不仅仅是单个数字,因此它可以处理更大的范围,但代价是可能失去精度

尝试打印出你的浮点数,你会得到94800620000而不是94800620800,因为较低的位丢失了

Int32的最大值为2,147,483,647。你的价值要高得多。

看一下system.int32.maxvalue

常量表达式提供的值不在int数据类型范围内

Int32的取值范围是−2,147,483,648到2,147,483,647。