C代码:左移位正在移位,但顶端的位正在下降

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

我正在做一个小型嵌入式项目,通过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 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。@WeatherVane
double 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);