在 c 中检索 signed long long 的最重要的 32 位

retrieving most significant 32-bits of a signed long long in c

由于某些原因,当用指针引用位时,高 32 位丢失

机器是小端。

s64 num = 0x12345678ABCDEF99;
printf("%x%x", *(int* )((&num) + sizeof(int) ) ,*(int* )(&num));
//i used *(int* )(&num)to show that it works only with the first 32 bits

输出:0abcdef99

((&num) + sizeof(int))

这不会将 &num 指针移动到 4 个字节(假设 sizeof (int) 为 4),而是移动到 4 int,即。即,16 个字节。这样做:

((unsigned char *) &num + sizeof (int))

请注意,当您取消引用对象时,这也是未定义的行为,因为它违反了 C 别名规则。正如评论中也提到的那样,%x 需要一个 unsigned int 但你传递了一个 int 参数。

1 添加到 T 类型的指针时,地址会增加 sizeof(T) 而不是 1

我相信这会起作用(如果您正在为 64 位编译它):

printf("%x%x", *(int* )((u64)(&num) + sizeof(int) ) ,*(int* )(&num));

但更安全的是:

printf("%x%x", (int)((u64)num >> 32) ,(int)num);

编辑:

我认为情况并非如此,但如果您不知道,printf 还支持以下格式的 64 位值:

printf("%llx", num);