为什么我从 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" 快速找到。