【发布时间】:2017-02-13 10:57:33
【问题描述】:
我在 64 位 linux 机器上编译了以下程序:
#include <stdio.h>
main()
{
int a = 12345;
if (a == 12346)
printf ("YES\n");
return;
}
如果我使用 hexdump 输出二进制文件,我可以找到 12346(十六进制的 303a),但找不到 12345 的值 (0x3039)。这是为什么呢?
(小端或大端在找到该值时应该没有区别)
【问题讨论】:
-
为什么小与大没有区别?
-
我希望编译器能够完全优化比较。您确定您找到的
0x303a是源文件中的实际数字,而不是其他恰好相同的两个字节序列吗? -
如果我按照您的描述进行编译并使用
gcc main.c进行编译,我会在偏移量 00000538 处看到39 30,仅在3A 30之前几个字节。如果我使用gcc -O2 main.c(例如,打开优化),我看不到它们中的任何一个(不出所料,因为整个事情最终都是return)。 -
您的程序格式不正确。任何现代 C 编译器都会告诉你。
-
查看generated assembly code。如果代码没有优化,你应该找到这两个数字。