我有一个用C编写的非常简单的双打计算器。它很简单,一个5岁的孩子可以做到。但是,我坚持到最后返回的数字。使用long类型的double变量,脚本会运行,但在中间,脚本会打印&#34; 4611686018427387904&#34;,然后&#34; -9223372036854775808&#34;,然后是0,直到for循环停止重复。< / p>
#include <stdio.h>
int main()
{
long doubles = 1;
int counter;
for(counter = 1; counter < 200; counter++) {
doubles = doubles * 2;
printf("%li\n", doubles);
}
return 7;
}
如果将双精度类型更改为int(并更改print语句中的参数类型),则代码返回正确的数字,然后打印&#34; 1073741824&#34;,然后&#34; - 2147483648&#34;,然后为0,直到循环用完。
如果你将double的类型更改为float并更改参数类型,则代码打印正确,然后&#34; 170141183460469231731687303715884105728.000000&#34;,然后&#34; inf&#34;对于循环的其余部分。
为什么这样做?我的猜测是你只能在y个字节中填充x长度的数字(4个用于int,8个用于long)do到二进制的限制。 32 1和0适合4个字节,64 1和0适合8个字节。该理论中的缺陷是int变量和float变量具有相同的字节数,如以下代码所证明的那样。
#include <stdio.h>
int main()
{
int integer;
long longVariable;
float floatingPoint;
printf("Size of int: %lu bytes\nSize of long: %lu bytes\nSize of float: %lu bytes\n", sizeof(integer), sizeof(longVariable), sizeof(floatingPoint));
return 7;
}
此代码打印:
int的大小: 4个字节
长度:8字节
浮动的大小: 4个字节
这使得我之前的理论无效,因为在我的理论中,如果分配的二进制空间相同,浮点数不应该高于int。世界上到底发生了什么?!
答案 0 :(得分:1)
float / double不像整数类型那样构建
int是直接的二进制数,可能带有符号。
浮点变量具有第三部分,即指数,因此有效值为
+/- mantisse ^ exponent
(^是数学。“power”,不是二进制“xor”)。
如果不是2的权力,则不会准确保存大数字
(如10000000000000000000000和10000000000000000000001
不会在浮动方面产生影响,它将是1000000 ......某事)
因为实际价值的空间有限
但它可以用它的指数模糊地代表这么大的数字。
问题是,转换为int想要确定它的确切值,
并且不适合4字节。