2

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

浮点数是 4 字节数据类型。Int32 也是 4 字节数据类型。

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

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

4

9 回答 9

5

因为您尝试分配的数字大于某个数字的最大可能值type Int32,恰好是 2,147,483,647。需要注意的是,a 的最大值Single3.402823 × 10 38

于 2011-09-09T09:11:12.817 回答
5

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

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

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

于 2011-09-09T09:12:11.667 回答
3

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

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

于 2011-09-09T09:11:54.767 回答
3

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

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

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

float f = 94800620800; 

对于一个足够大的整数类型来存储它的值,它可能与初始的 94800620800 不同。

于 2011-09-09T09:14:31.117 回答
1

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

Error   Integral constant is too large

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

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

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

于 2011-09-09T09:12:22.573 回答
1

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

浮点维基页面正在解释这是如何工作的。

于 2011-09-09T09:16:13.400 回答
0

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

看看system.int32.maxvalue

于 2011-09-09T09:12:10.390 回答
0

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

于 2011-09-09T09:12:32.153 回答
0

Int32 的范围从 − 2,147,483,648 到 2,147,483,647。您的变量超出范围。

于 2011-09-09T09:14:26.973 回答