对于这里的专家来说,这可能是非常基本甚至是愚蠢的,但我想了解这个问题。大多数时候我通常在C:
中写这样的十六进制值unsigned int a = 0xFFFF1232;
假设我试图提取第一个和最后一个16位,然后我就可以了:
unsigned short high = a >> 16; // Gives me 0xFFFF
unsigned short low = a & 0x0000FFFF; // Gives me 0x00001232 which is then stored as 0x1232
在我正在阅读的一些代码中,我遇到了以下内容:
unsigned short high = a >> 16;
unsigned short low = a & 0xFFFF;
我有两个问题
AND
而不是0xFFFF
?是为了保持紧凑吗? 0x0000FFFF
写为0x0000FFFF
是否始终安全?它在任何情况下都有不同的解释吗?答案 0 :(得分:7)
他们完全是同义词。省略前导零使其更具可读性。
答案 1 :(得分:3)
它们完全相同。
并且,您假设int总是32位长。如果您的平台碰巧使用64位整数,您会这样写吗?
unsigned short low = a & 0x000000000000FFFF; // ouch. Did I count them right?
还有另一个原因,你不应该浪费时间把前导零:你会尝试用小数点做下一步,这是一个坏主意:
int x = 00000377
printf("%d\n", x); // 255! WTF....
答案 2 :(得分:2)
在您的示例中,low
是short
(通常为16位)。因此,前导零不仅是冗余的,它们表明预期会产生32位结果,在这种情况下,高位被丢弃,因此可以说它使代码的意图更加清晰。
事实上在这种情况下
unsigned short low = a ;
就足够了,但也许不太清楚。
此外,您不应该假设整数宽度是合适的,而是使用<stdint.h>
类型:
uint32_t a = 0xFFFF1232;
uint16_t = a >> 16;
uint16_t = a & 0xFFFF;
如果您使用的VC ++不提供该标题,则可以使用this implementation
答案 3 :(得分:1)
像0x1
这样的东西被称为文字,默认为int类型。这不一定是32位,具体取决于编译器或平台,所以是的,有一个上下文,在这种情况下,不使用前导零是不安全的。
例如,在嵌入式系统中,遇到只有16位长的int类型是很常见的。如果你想要一个更长的整数,你需要使用long int。
在这种情况下,编译器会注意到您是否忘记将“L”附加到十六进制文字,以表示您想要更长的类型。
unsigned int a = 0xFFFF1234;
充其量只是一个编译器错误,或者是最坏的未检测到的错误。您需要使用
unsigned long int a = 0xFFFF1234L;
代替。
答案 4 :(得分:1)
在你的情况下,0x0000FFFF和0xFFFF是相同的。
如果您的变量不是无符号的话,情况就不是这样了:16位值0xFFFF表示-1,即32位的0xFFFFFFFF。