私は次の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]);
}
これを (C または C++ として) Microsoft Visual Studio Community 2015 でコンパイルして実行すると、出力は次のようになります。
013E9154 13e9154 13e9154
+ 0x8000000000000000
の上位ビットを設定することを期待していたコードは、a[1]
黙って無視されたようです。
ただし、a
内部の初期化を移動するmain
と、出力は期待どおりになります。
00179154 179154 8000000000179154
グローバルでa
は、追加が黙って無視されるのはなぜですか? 試行された追加は、実際に上位ビットを設定するa[1]
必要がありますか、それともコンパイラ エラーを引き起こす必要がありますか?
興味深いことに、+ 0x8000000000000000
上記のコードを に置き換えると| 0x8000000000000000
、「エラー C2099: 初期化子が定数ではありません」というメッセージが表示されます。
編集:キャストがなくても同様の問題が発生する可能性があります。x64 用にコンパイルされた次のコードは、同じ値 (例: 000000013FB8D180
) を 3 回出力します。
#include <stdio.h>
int i;
int * a[] = { &i, &i + 0x100000000 };
int main() {
printf("%p %p %p\n", &i, a[0], a[1]);
}