我有以下 C 代码:
#include <stdint.h>
#include <stdio.h>
int i;
uint64_t a[] = { (uint64_t)&i, (uint64_t)&i + 0x8000000000000000 };
int main() {
printf("%p %llx %llx\n", &i, a[0], a[1]);
}
如果我使用 Microsoft Visual Studio Community 2015 编译它(作为 C 或 C++)然后运行它,输出类似于以下内容:
013E9154 13e9154 13e9154
似乎+ 0x8000000000000000
我希望设置高位的 codea[1]
已被默默地忽略。
a
但是,如果我移动inside的初始化main
,输出就是我所期望的:
00179154 179154 8000000000179154
对于a
全局,为什么添加被默默忽略?尝试添加是否应该实际设置高位,a[1]
还是应该导致编译器错误?
有趣的是,如果+ 0x8000000000000000
在上面的代码中替换为| 0x8000000000000000
,我会得到“错误 C2099:初始化程序不是常量”。
编辑:即使没有演员表,也会出现类似的问题。为 x64 编译,以下代码打印相同的值(例如000000013FB8D180
)三次:
#include <stdio.h>
int i;
int * a[] = { &i, &i + 0x100000000 };
int main() {
printf("%p %p %p\n", &i, a[0], a[1]);
}