英特尔指令集参考声明(重点是地雷):
将signed-integer源操作数转换为双扩展精度浮点格式,并将值推送到FPU寄存器堆栈上。源操作数可以是一个字、双字或四字整数。加载时不会出现舍入错误。保存源操作数的符号。该指令在非64位模式和64位模式下的操作是相同的.
在这里您可以看到我的测试用例:
% cat stackoverflow.c
float uint2float(unsigned int a) {
return a;
}
% gcc -c stackoverflow.c
% objdump -d stackoverflow.o
stackoverflow.o: file format elf32-i386
Disassembly of section .text:
00000000 <uint2float>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 8b 45 08 mov 0x8(%ebp),%eax
9: ba 00 00 00 00 mov $0x0,%edx
e: 89 45 f8 mov %eax,-0x8(%ebp)
11: 89 55 fc mov %edx,-0x4(%ebp)
14: df 6d f8 fildll -0x8(%ebp)
17: c9 leave
18: c3 ret
% gcc --version
gcc-4.6.real (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3发布于 2012-07-30 00:52:52
啊哈!"ll“后缀将使用指令的64位输入变体!GCC将上32位初始化为0,因此输入是否有符号并不重要。
https://stackoverflow.com/questions/11714238
复制相似问题