[英]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。 你的价值要高得多。
提供的常量表达式值不在int数据类型的范围内。
Int32的范围从 - 2,147,483,648到2,147,483,647。 你的变量超出了范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.