为什么我从 scanf 得到一个浮点数,而不是一个双精度数?
Why am I getting a float, not a double, from scanf?
最近在写fp数的小程序。
首先,我将 double fp 读入对齐的位置(对于 SSE 指令)
segment .data
scanf_fmt:
db "%f%ld", 0
segment .bss
align 16, db 0
x resq 1 ; for double fp
number resq 1 ; for integer
align 16, db 0
res resq 1 ; for double fp
lea rdi, [fmt]
lea rsi, [x]
lea rdx, [number]
xor eax, eax ; number of fp values(edited from mov rax, 1 ,still looks the same)
call scanf
那我翻倍:
movsd xmm0, [x]
然后我开始调试:我输入1.6
让scanf读取。
100 movsd xmm0, [x]
(gdb) p/f x
= 1.60000002
(gdb) n
(gdb) p $xmm0
= {v4_float = {1.600000002, 0, 0, 0}, v2_double = {5.2..., 0}, ...
标签 x
处的浮点值已移动,但作为 float(movss
) 而不是我使用的 double(movsd
)
这是怎么回事?
来自 scanf(3)
:
%f
Matches an optionally signed floating-point number; the next pointer must be a pointer to float
.
所以 scanf 将 32 位单精度 float
存储到 [x]
中,就像您告诉它的那样。接下来的 32 位保持为零。
你看到的其他一切都是它的明显结果。
double
的转换说明符是 %lf
,您可以通过在手册页中搜索 "double" 快速找到。
最近在写fp数的小程序。 首先,我将 double fp 读入对齐的位置(对于 SSE 指令)
segment .data
scanf_fmt:
db "%f%ld", 0
segment .bss
align 16, db 0
x resq 1 ; for double fp
number resq 1 ; for integer
align 16, db 0
res resq 1 ; for double fp
lea rdi, [fmt]
lea rsi, [x]
lea rdx, [number]
xor eax, eax ; number of fp values(edited from mov rax, 1 ,still looks the same)
call scanf
那我翻倍:
movsd xmm0, [x]
然后我开始调试:我输入1.6
让scanf读取。
100 movsd xmm0, [x]
(gdb) p/f x
= 1.60000002
(gdb) n
(gdb) p $xmm0
= {v4_float = {1.600000002, 0, 0, 0}, v2_double = {5.2..., 0}, ...
标签 x
处的浮点值已移动,但作为 float(movss
) 而不是我使用的 double(movsd
)
这是怎么回事?
来自 scanf(3)
:
%f
Matches an optionally signed floating-point number; the next pointer must be a pointer tofloat
.
所以 scanf 将 32 位单精度 float
存储到 [x]
中,就像您告诉它的那样。接下来的 32 位保持为零。
你看到的其他一切都是它的明显结果。
double
的转换说明符是 %lf
,您可以通过在手册页中搜索 "double" 快速找到。