C代码:左移是移位但删除高位

C code: left shift is shifting but dropping top bits

我正在做一个小型嵌入式项目,我有 40 位通过 SPI 类型接口传输。我将这些位从 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

为什么说高字节被截掉了? 如果我使用你的代码并打印结果就可以了:

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);

输出是

0000000102030401

您是否使用 %d 打印输出值?

printf 格式说明符不正确。

#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;
}

程序输出:

cedf1234
abcedf1234

仔细看

uint32_t *disp_addr = &temp;
...
error_lower = *(disp_addr+0);

因为 disp_addr 是指向 uint32_t 的指针,所以您将 32 位值存储在 8 位变量中。根据您的机器字节序和加载方式 disp_addr,您可能加载了错误的数据。

您可能想做的事:

uint32_t *disp_addr = &temp;
...
error_lower = *(uint8_t *)(disp_addr+0);

这不一样。