【发布时间】:2018-01-09 17:42:04
【问题描述】:
我很难理解gcc 在这方面的行为。对于我的架构,浮点数的大小为 4 个字节。但是我仍然可以在浮点数中存储一个 8 字节的实际值,而我的编译器对此一无所知。
例如我有:
#include <stdio.h>
int main(int argc, char** argv){
float someFloatNumb = 0xFFFFFFFFFFFF;
printf("%i\n", sizeof(someFloatNumb));
printf("%f\n", someFloatNumb);
printf("%i\n", sizeof(281474976710656));
return 0;
}
我希望编译器会侮辱我,或者显示某种免责声明,因为我不应该这样做,至少我认为这是一种扭曲的魔法。
程序简单地运行:
4
281474976710656.000000
8
所以,如果我打印 someFloatNumb 的大小,我会得到 4 个字节,这是预期的。但受影响的值不是,如下所示。
所以我有几个问题:
sizeof(variable) 是否只是简单地获取变量类型并返回 sizeof(type),在这种情况下可以解释结果吗?
gcc 是否/可以增加类型的容量? (在幕后管理多个变量以允许我们做这类事情)
【问题讨论】:
-
sizeof(281474976710656)只是给你sizeof(int) -
我仍然可以在浮点数中存储一个 8 字节的实际值 你可以吗?如何?您可以存储的只是那个 8 字节值的浮点 表示。而且你会在转换过程中丢失很多信息。
-
@cleblanc 这不是必须的,可能是 sizeof(long) 以及 sizeof(long long)
-
您将值
0xFFFFFFFFFFFF转换为浮点数,编译器会转换它,而不是reinterpret_cast变量。你注意到了吗,0xFFFFFFFFFFFF不是偶数,因为它作为浮点数的表示281474976710656.000000是,这是由尾数引起的,它不能存储整数常量的最低有效位。 -
如果编译器侮辱了我,我会将其从系统中删除。
标签: c gcc floating-point