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

时间:2011-09-09 09:08:59

标签: c# floating-point int32

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

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

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

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

9 个答案:

答案 0 :(得分:6)

因为您尝试分配的数字大于Int32的数字Single,恰好是2,147,483,647。需要注意的是,{{1}}的最大值为largest possible value

答案 1 :(得分:5)

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

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

另外,请查看此SO问题 - what the difference between the float and integer data type when the size is same in java?。这是一个Java问题,但概念是相同的,并且有差异的详细解释,即使它们的大小相同。

答案 2 :(得分:3)

因为该数字对于4字节int来说太大了。像Int32这样的标量值有一个最小和最大限制(分别为-2 31 和2 31 - 在这种情况下为1),你只需要不要存储超出此范围的值。

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

答案 3 :(得分:3)

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

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

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

float f = 94800620800; 

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

答案 4 :(得分:1)

也许您应该阅读错误消息? ;)

Error   Integral constant is too large

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

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

尝试打印浮动内容,因为低位丢失,您将获得94800620000而不是94800620800

答案 5 :(得分:1)

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

floating point wiki page正在解释这是如何运作的。

答案 6 :(得分:0)

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

查看system.int32.maxvalue

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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