一个简单的方法是让编译器显示给你:
// float.c
float var1[2023] = { -53.3125 };
然后编译它:
$ gcc -S float.c
然后研究输出:
.file "float.c"
.globl var1
.data
.align 32
.type var1, @object
.size var1, 8092
var1:
.long 3260366848
.zero 8088
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-39)"
.section .note.GNU-stack,"",@progbits
请注意,这只是 GCC 的实现; clang 的做法不同:
.file "float.c"
.type var1,@object # @var1
.data
.globl var1
.align 16
var1:
.long 3260366848 # float -5.331250e+01
.long 0 # float 0.000000e+00
.long 0 # float 0.000000e+00
// thousands of these
.size var1, 8092
.ident "clang version 3.4.2 (tags/RELEASE_34/dot2-final)"
.section ".note.GNU-stack","",@progbits
编辑 - 为了回答下面的评论,long 的使用只是简单地设置了一个特定的位模式,该位模式对编译器的浮点格式概念进行编码。
3260366848的值与十六进制的0xC2554000相同,二进制为11000010010101010100000000000000,是CPU关心的二进制值。如果你愿意,你可以拿出你的 IEEE 浮点规范并对其进行解码,有符号,即指数等,但浮点编码的所有细节都由编译器处理,而不是汇编器。
我不是编译器专家,但几十年前我正在追踪 C 编译器的浮点支持中的一个错误,虽然我不记得细节,但在我的脑海里,它让我印象深刻编译器这样做会很有帮助,因为我不必使用反汇编程序来找出位模式的实际编码。
肯定会有其他人在这里权衡。
EDIT2 位就是位,这个小 C 程序(依赖于 sizeof int 和 sizeof float 的大小相同)证明了这一点:
// float2.c
#include <stdio.h>
#include <memory.h>
int main()
{
float f = -53.3125;
unsigned int i;
printf("sizeof int = %lu\n", sizeof(i));
printf("sizeof flt = %lu\n", sizeof(f));
memcpy(&i, &f, sizeof i); // copy float bits into an int
printf("float = %f\n", f);
printf("i = 0x%08x\n", i);
printf("i = %u\n", i);
return 0;
}
运行显示位就是位:
sizeof int = 4
sizeof flt = 4
float = -53.312500
i = 0xc2554000
i = 3260366848 <-- there ya go
这只是 32 位的显示概念,具体取决于您如何看待它们。
现在要回答如何根据浮点值自行确定 3260366848 的问题,您需要拿出您的 IEEE 标准并手动提取所有位(推荐浓咖啡),然后阅读那些 32位为整数。