【发布时间】:2015-05-20 14:43:22
【问题描述】:
我正在做一个小型嵌入式项目,我通过 SPI 类型接口传输了 40 位。我将这些位从 32 位总线中提取出来,并将高 32 位放入 uint32_t 变量中,将低 8 位放入 uint8_t 变量中。我正在尝试将它们组合成一个uint64_t。但是,当我移动 8 位时,它会丢弃前 8 位。这是我的代码。
uint64_t getError()
{
uint32_t * disp_addr = (uint32_t*)(MYDISPLAY);
uint64_t error_upper;
uint8_t error_lower;
uint64_t error= 0;
error_lower = *(disp_addr+1);
error_upper = *(disp_addr+0);
error = ((uint64_t) error_upper) <<8 | error_lower;
return error;
}
此代码可以正常工作,只是它丢弃了我的前 8 位。 任何想法或提示将不胜感激。谢谢。
编辑
uint64_t getError()
{
uint32_t * disp_addr = (uint32_t*)(MYDISPLAY);
uint64_t error_upper;
uint8_t error_lower;
uint64_t error= 0;
error_lower = 0x34;
error_upper = 0xABCDEF12;
error = ((uint64_t) error_upper) <<8 | error_lower;
printf("%010x", error);
//return error;
}
结果: 00cdef1234
【问题讨论】:
-
期望的行为是什么?
-
当然在下降.. 他们会去哪里?
-
在移位前转换高位 var。
-
它应该在我的 uint64_t 错误的低 40 位中连接 error_upper 和 error_lower。我明白了,如果我左移一个 32 位 int,最高位会下降。但是如果我将它类型转换为 64 位 int 并对其进行移位,它不应该将这些位移动到 33-40 的位置吗?
-
printf("%010x", error);正在打印00cedf1234。printf("%010llx", error);正在打印abcedf1234。我想我们可以在这里结束这个问题..