在 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);
由于某些原因,当用指针引用位时,高 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);