这是 printf 函数的原型
int printf(const
char* format,
...);
它接受一个格式化字符串 format 和不固定的若干个参数
这些参数中的浮点数会依次存放在 %xmm0 ~ %xmm7 寄存器,如果浮点数个数超过8个,则超出部分存放在栈上
这些参数中的非浮点数会依次存放在 %edi %edx %ecx %r8d %r8d 寄存器上,如果非浮点数个数超过5个,则超出部分存放在栈上
数据类型/参数序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8+ |
---|
printf 函数在格式化字符串的时候,从左往右扫描 format 字符串中的控制符
比如
printf("%d %f %d %f",
1,
2.0,
3,
4.0);
参数存放:1, 2.0, 3, 4.0
format 中参数读取:”%d %f %d %f”
以下是用 objdump 后的反汇编代码,也可以证明以上结果
400535:
48 ba 00
00
00
00
00 movabs $0x4010000000000000,%rdx
40053c:
00
10
40
40053f:
48 b8 00
00
00
00
00 movabs $0x4000000000000000,%rax
400546:
00
00
40
400549:
48
89
55 f8 mov %rdx,-0x8(%rbp)
40054d: f2 0f
10
4d f8 movsd -0x8(%rbp),%xmm1
400552: ba 03
00
00
00 mov $0x3,%edx
400557:
48
89
45 f8 mov %rax,-0x8(%rbp)
40055b: f2 0f
10
45 f8 movsd -0x8(%rbp),%xmm0
400560: be 01
00
00
00 mov $0x1,%esi
400565: bf 10
06
40
00 mov $0x400610,%edi
40056a: b8 02
00
00
00 mov $0x2,%eax
40056f: e8 9c fe ff ff callq 400410
<printf@plt>
回到题主的问题,为什么以下代码的输出结果是0?
printf(“%f
”,3/2)
先看参数存放:3/2
format 中参数读取:”%f ”
我们把参数存放到了 %edi 寄存器了,却希望从 %xmm0 寄存器中读这个参数,显然不会成功。
但是从输出结果为0看,应该是当时 %xmm0 寄存器的数值恰好是0,而这仅仅是巧合而已。
以上是在 x86_64 环境下测试的结果。
不需要,我已经几乎两年没用过有线充电了。
把常用场合都部署好无线充电以后,真的不用操心换手机换充电器之类的事情。
其实很简单的一个问题:取消耳机口之后,各位是改用L口耳机C口耳机,还是改用无线耳机?我曾经以为会普及L口或者C口耳机,然而现实就是无线耳机开始普及。
无线充电座普及之后,由于它没有插拔,所以她的寿命其实远比手机要长。
--
所以,如果你没有无线充,强烈建议你尝试无线充。