繁体   English   中英

为什么我不能将大值传递给Int32?

[英]Why can't I pass a large value as an Int32?

我有一个号码:94,800,620,800

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

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

请解释这个问题。 为什么我在使用Int32时出错。 为什么我可以将此数字用于float数据类型,因为它们都是4字节数据类型。 谢谢。

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

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

浮点值可以取以下范围内的值:±1.5×10-45到±3.4×1038

另外,看看这个SO问题 - 当java中的大小相同时,浮点数和整数数据类型之间有什么区别? 这是一个Java问题,但概念是相同的,并且有差异的详细解释,即使它们的大小相同。

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

浮点数的存储方式完全不同,因此您不会在运行时期间获得具有巨大值的编译器错误,只会出现可能的精度问题。

因为那些类型的内部表示。

float使用类似i,d ^ n的东西,其中i是整数部分,d是小数部分,n是指数(当然,这发生在基数2中)。

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

float f = 94800620800; 

对于足以存储其值的整数类型,它可能与初始94800620800不同。

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

Error   Integral constant is too large

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

另一方面,浮点数是有效的,因为它存储了一个尾数和指数,而不仅仅是一个数字,所以它可以应对更大的范围,但代价是可能会失去精度

尝试打印你的浮动,你会得到94800620000而不是94800620800因为低位丢失

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

浮点维基页面解释了它的工作原理。

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

看看system.int32.maxvalue

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

Int32的范围从 - 2,147,483,648到2,147,483,647。 你的变量超出了范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM