uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化

Posted FightingBoom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化相关的知识,希望对你有一定的参考价值。

1、明确类型定义

typedef unsigned char uint8_t;

typedef unsigned int uint32_t;

 

uint8_t:

u:代表 unsigned 即无符号,即定义的变量不能为负数;

int:代表类型为 int 整形;

8:代表一个字节,即为 char 类型;

_t:代表用 typedef 定义的;

整体代表:用 typedef 定义的无符号 char 型宏定义;

uint32_t:

u:代表 unsigned 即无符号,即定义的变量不能为负数;

int:代表类型为 int 整形;

32:代表四个字节,即为 int 类型;

_t:代表用 typedef 定义的;

整体代表:用 typedef 定义的无符号 int 型宏定义;

 

2、由上述分析可得知,一个 uint32_t 类型的变量长度等于4个 uint8_t 类型的变量。理解这个后,我们再看一个问题:

uint8_t  dst;
uint32_t src;

src = 0x0201;

dst = (uint8_t *)src;

此时 dst 的输出可能为 0x01;因为把 src 强制转换为 uint8_t 类型了,前边的高字节取不到,只能丢掉。这样就导致数据错乱。

 

3、当然上边举这个例子可能不太完善,我实际在操作的时候,遇到的问题如下:

我定义了一个 uint32_t 类型的数组(当然这个时候就已经出错了),然后需要把此数组的首地址传到一个函数的形参中,但是形参要求是 uint8_t 类型的,因此加了一个强制转换,但是在取到转换后的数据时,发现数据错乱了,后经多次排查,才发现是 uint32_t 强制转换为 uint_8 类型时出了问题,要谨记。

 

4、经过上述问题后,以后在定义数组时,都需要定义成 uint8_t 也就是 uchar 类型的,这样就能避免很多错误。

 

5、下边有一个参考的文章,讲的是两种类型之间的相互转换,值得一看,看懂后,就会理解的更加透彻;

原文网址:https://blog.csdn.net/farsight_2098/article/details/88743495

原文内容复制如下:

写单片机程序的时候经常遇到unsigned char类型和unsigned int类型相互转化

下面写一个简单的例子实现互相转化的过程,比较简单,直接上代码。

#include<stdio.h>
#define uint8 unsigned char
#define uint32 unsigned int

#define BREAK_UINT32( var, ByteNum ) \\
          (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF))

#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) \\
          ((uint32)((uint32)((Byte0) & 0x00FF) \\
          + ((uint32)((Byte1) & 0x00FF) << 8) \\
          + ((uint32)((Byte2) & 0x00FF) << 16) \\
          + ((uint32)((Byte3) & 0x00FF) << 24)))
int main()
    uint8 temp[4] = 0x01,0x02,0x03,0x04;
    uint32 tevalu = 0;
    
    tevalu = BUILD_UINT32(temp[0],temp[1],temp[2],temp[3]);
    printf("---%08x-------\\n",tevalu);
    
    uint8 temp2[4] = 0x0;
    temp2[0] = BREAK_UINT32(tevalu,0);
    temp2[1] = BREAK_UINT32(tevalu,1);
    temp2[2] = BREAK_UINT32(tevalu,2);
    temp2[3] = BREAK_UINT32(tevalu,3);
    
    printf("--%02x--%02x--%02x--%02x--\\n",temp2[0],temp2[1],temp2[2],temp2[3]);
    
    return 0;


还有一些常用的宏定义,这里加上

#define BUILD_UINT16(loByte, hiByte) \\
          ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8)))

#define HI_UINT16(a) (((a) >> 8) & 0xFF)
#define LO_UINT16(a) ((a) & 0xFF)

#define BUILD_UINT8(hiByte, loByte) \\
          ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4)))

#define HI_UINT8(a) (((a) >> 4) & 0x0F)
#define LO_UINT8(a) ((a) & 0x0F)
————————————————
版权声明:本文为CSDN博主「文石_2009」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/farsight_2098/article/details/88743495

运行结果如下:

 


最后祝大家2019年的程序员节,节日快乐!

 

 

以上是关于uint8_t uint32_t 类型强制转换出错 以及 unsigned char 类型和 unsigned int 类型相互转化的主要内容,如果未能解决你的问题,请参考以下文章

从 uint8_t* 到 uint32_t 的无效转换 - 从 32 位架构迁移到 64 位架构时?

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结

uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了

uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?

uint8_t 数据类型