C代码:左移位正在移位,但顶端的位正在下降
我正在做一个小型嵌入式项目,通过SPI类型的接口传输40位数据。我将这些位从32位总线中取出,将上面的32位放入C代码:左移位正在移位,但顶端的位正在下降,c,shift,C,Shift,我正在做一个小型嵌入式项目,通过SPI类型的接口传输40位数据。我将这些位从32位总线中取出,将上面的32位放入uint32\u t变量中,将下面的8位放入uint8\u t变量中。我正试图将它们组合成一个uint64\t。但是,当我移位8时,它会删除前8位。这是我的密码 uint64_t getError() { uint32_t * disp_addr = (uint32_t*)(MYDISPLAY); uint64_t error_upper; uint8_t e
uint32\u t
变量中,将下面的8位放入uint8\u 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;
}
uint64\u t getError()
{
uint32_t*显示地址=(uint32_t*)(MYDISPLAY);
uint64错误上限;
uint8错误较低;
uint64_t错误=0;
错误\u lower=*(显示地址+1);
错误\u upper=*(显示地址+0);
error=((uint64\u t)error\u upper)你为什么说上面的字节被截断了?
如果我使用您的代码并打印,结果就可以了:
uint32_t temp = 0x01020304;
uint32_t *disp_addr = &temp;
uint64_t error_upper;
uint8_t error_lower;
uint64_t error= 0;
error_lower = *(disp_addr+1);
error_upper = *(disp_addr+0);
error = (error_upper<<8) | error_lower;
printf("\n%08X%08X\n", (uint32_t)(error>>32), error);
是否使用%d
打印出值?格式说明符不正确
#include <stdio.h>
typedef unsigned __int64 uint64_t;
typedef unsigned char uint8_t;
int main(void) {
uint64_t error_upper, error;
uint8_t error_lower;
error_lower = 0x34;
error_upper = 0xABCEDF12;
error = (error_upper << 8) | error_lower;
printf("%x\n", error);
printf("%llx\n", error);
return 0;
}
仔细看
uint32_t *disp_addr = &temp;
...
error_lower = *(disp_addr+0);
因为disp\u addr
是uint32的ptr,所以您将32位的值存储在一个8位变量中。根据您的机器终端以及加载disp\u addr
的方式,您可能加载了错误的数据
你可能想做:
uint32_t *disp_addr = &temp;
...
error_lower = *(uint8_t *)(disp_addr+0);
这是不一样的。期望的行为是什么?当然是下降。它们会去哪里?在移位之前转换高位var。它应该在uint64\t错误的下40位串联error\u upper和error\u lower。我得到,如果我左移32位int,则高位会下降。但是如果我将其键入64位int并将其移位,是否应将这些位移到位置33-40?printf(“%010x”,错误);
正在打印00cedf1234
printf(“%010llx”,错误)
正在打印abcedf1234
。我想我们可以在这里结束这个问题。@SparkyGuru AFAIK%X评估32位变量。你的代码是正确的,就是你的fprint。可能,我不明白为什么会这样。有什么方法可以测试它吗?好的评论,当我尝试printf时,请不要回答(“llx\n”,错误);我得到500000ffffffff。@WeatherVanedouble L
是我使用的。@SparkyGuru如果我运行两种格式的输出的确切代码。LPs删除了他最近的评论,我删除了我的回复。%x
需要类型为unsigned int
的参数;将其与uint64\u t
参数一起使用具有未定义的行为。de>%llx
需要类型为无符号长整型
的参数;将其与uint64_t
参数一起使用具有未定义的行为,除非uint64_t
定义为无符号长整型
(通常是这样).
为
中定义的类型定义printf
格式的宏,或者您可以转换为uintmax\t
并使用%ju
:printf(“%ju\n”,(uintmax\t)x)
@KeithThompson谢谢,我认为你对预期参数的评论帮助最大。我是一名noob程序员。我是一名被投入编程角色的电子工程师学生。
cedf1234
abcedf1234
uint32_t *disp_addr = &temp;
...
error_lower = *(disp_addr+0);
uint32_t *disp_addr = &temp;
...
error_lower = *(uint8_t *)(disp_addr+0);