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);
这不一样。
我正在做一个小型嵌入式项目,我有 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);
这不一样。