我有一个简单的程序,使用联合体来将64位整数与其对应的字节数组进行转换:
union u
{
uint64_t ui;
char c[sizeof(uint64_t)];
};
int main(int argc, char *argv[])
{
u test;
test.ui = 0x0123456789abcdefLL;
for(unsigned int idx = 0; idx < sizeof(uint64_t); idx++)
{
cout << "test.c[" << idx << "] = 0x" << hex << +test.c[idx] << endl;
}
return 0;
}
我期望的输出结果是:
test.c[0] = 0xef
test.c[1] = 0xcd
test.c[2] = 0xab
test.c[3] = 0x89
test.c[4] = 0x67
test.c[5] = 0x45
test.c[6] = 0x23
test.c[7] = 0x1
但实际上我得到的是:
test.c[0] = 0xffffffef
test.c[1] = 0xffffffcd
test.c[2] = 0xffffffab
test.c[3] = 0xffffff89
test.c[4] = 0x67
test.c[5] = 0x45
test.c[6] = 0x23
test.c[7] = 0x1
我在Ubuntu LTS 14.04上使用GCC看到这个问题。我已经试图理解这个问题一段时间了。为什么char数组的前4个元素显示为32位整数,并带有0xffffff前缀?而且为什么只有前4个,不是所有的元素?有趣的是,当我使用数组写入流(这是整个事情的最初目的)时,会写入正确的值。但是逐个比较字符显然会导致问题,因为前4个字符不等于0xef,0xcd等等。
(char*)
类型,然后读取4个字节...? - SteJint
,根据内核构建的体系结构,它将成为16位、32位或64位字...虽然有点猜测,但我需要重新学习C++!此外,根据@ewd的评论,您可能希望将其明确转换为(unsigned int)
或(unsigned char)
。 - SteJsizeof
定义大小的说明:如果您使用sizeof(<variable name>);
而不是sizeof(<variable type>);
,则如果您稍后更改源变量的类型,则更改会级联到依赖项。在这种情况下,char c[sizeof(ui)];
的大小始终与ui
相同。同样,在 for 循环中sizeof(test.ui)
也是如此。 - user4581301