解释十六进制值?

时间:2010-12-03 22:33:16

标签: c

对于这里的专家来说,这可能是非常基本甚至是愚蠢的,但我想了解这个问题。大多数时候我通常在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; 

我有两个问题

  • 当您{{1}使用掩码的32位值时,为什么人们会写AND而不是0xFFFF?是为了保持紧凑吗?
  • 0x0000FFFF写为0x0000FFFF是否始终安全?它在任何情况下都有不同的解释吗?

5 个答案:

答案 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)

在您的示例中,lowshort(通常为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。