#include <stdio.h>
int main()
{
int a= -1;
unsigned int b=-2;
printf("%d,%u\n",a,b);
return 0;
}
转成汇编为:
0000000000000000 <main>:
0: f3 0f 1e fa endbr64
4: 55 push %rbp
5: 48 89 e5 mov %rsp,%rbp
8: 48 83 ec 10 sub $0x10,%rsp
c: c7 45 f8 ff ff ff ff movl $0xffffffff,-0x8(%rbp)
// int a = 0xffffffff
13: c7 45 fc fe ff ff ff movl $0xfffffffe,-0x4(%rbp)
// unsigned int b = 0xffffffffe
1a: 8b 55 fc mov -0x4(%rbp),%edx
// arg3 = b
1d: 8b 45 f8 mov -0x8(%rbp),%eax
20: 89 c6 mov %eax,%esi
// arg2 = a
22: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi
// rdi = "%d,%u\n"
29: b8 00 00 00 00 mov $0x0,%eax
2e: e8 00 00 00 00 callq 33 <main+0x33>
33: b8 00 00 00 00 mov $0x0,%eax
38: c9 leaveq
39: c3 retq
可以看到,运行时unsigned int
和int
在数据上完全没有区别,都是将数据转成补码,按照补码
来存数据。只有在输出流的时候才会表现出差异(有不同的解释权
),这种策略果然高效,难怪都采用补码。