我只想将 uint8_t 数组连接到 uint64_t。事实上,我解决了我的问题,但需要了解原因。这是我的代码;
uint8_t byte_array[5];
byte_array[0] = 0x41;
byte_array[1] = 0x42;
byte_array[2] = 0x43;
byte_array[3] = 0x44;
byte_array[4] = 0x45;
cout << "index 0: " << byte_array[0] << " index 1: " << byte_array[1] << " index 2: " << byte_array[2] << " index 3: " << byte_array[3] << " index 4: " << byte_array[4] << endl;
/* This does not work */
uint64_t reverse_of_value = (byte_array[0] & 0xff) | ((byte_array[1] & 0xff) << 8) | ((byte_array[2] & 0xff) << 16) | ((byte_array[3] & 0xff) << 24) | ((byte_array[4] & 0xff) << 32);
cout << reverse_of_value << endl;
/* this works fine */
reverse_of_value = (uint64_t)(byte_array[0] & 0xff) | ((uint64_t)(byte_array[1] & 0xff) << 8) | ((uint64_t)(byte_array[2] & 0xff) << 16) | ((uint64_t)(byte_array[3] & 0xff) << 24) | ((uint64_t)(byte_array[4] & 0xff) << 32);
cout << reverse_of_value << endl;
第一个输出将是“44434245”,第二个输出将是“4544434241”,这就是我想要的。
因此,正如我们所看到的,当我使用将每个字节转换为 uint64_t 代码时,代码可以工作,但是,如果我不使用转换,则会给出不相关的结果。有人能解释一下原因吗?
左移 auint8_t
这么多位不一定能起作用。左侧操作数将提升为int
,你不知道其宽度。它could已经是 64 位了,但也可能是 32 位甚至 16 位,在这种情况下……结果会去哪里?没有足够的空间容纳它!您的代码稍后将结果放入uint64_t
:表达式是单独计算的。
您已在第二个版本中正确修复了该问题,方法是转换为uint64_t
before发生左移。在这种情况下,表达式肯定会具有所需的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)