大神看看这个单片机错误如何修改,警告 ‘=’ pointer truncation,unsigned int a;
struct {
unsigned char d;
unsigned char e;
}x[3];
main()
{
a=(unsigned int *)&(x[1].d);
while(1);
}
a=(unsigned int *)&(x[1].d); 这一行提示警告 ‘=’ pointer truncation 应该如何修改才不会提示警告
,unsigned int *a;,代码中的问题是变量的值和变量的地址没有分清,教科书中现成的东西,仔细看看就知道了。,
xstong 发表于 2021-1-14 09:05
unsigned int *a;
谢谢,这个办法挺好,
munuc_w 发表于 2021-1-14 10:55
代码中的问题是变量的值和变量的地址没有分清,教科书中现成的东西,仔细看看就知道了。
您提醒的对,我改成a= *((unsigned int *)&(x[1].d));就没有错误了。,建议好好学习取地址与指针方面的知识,以及在51单片机中的应用。你的目的不应该是让程序编译通过,而是搞懂每一个语句、每一个符号的意思。x[3],表示x是数组变量。&x[n]表示数组第n号元素的地址,已经算是指针了。你的程序中,x[1].d是第一号元素的结构体变量中的d变量, &(x[1].d)表示取得第一号元素的结构体变量中的d变量所在的单元地址。 unsigned int a,表示a是一个整数变量,接收整形数据。
你的程序的目的是把数组中某个元素对应的结构体内的两个字符行数据转换为整形数据后,赋值给a。
明白这个目的后,可以使用a= *((unsigned int *)&(x[1].d));也可以使用a=x[1].d*256+x[1].e;获得转换结果。
51系列中保存int型数据时,数据保存在两个单元中。高8位数据放在低地址单元中,低8位数据放在高地址单元。比如258这个数据,转换为16进制数据为0x0102,假设这个数据保存在地址0x0008开始的单元中,那么0x0008单元中保存0x01,0x0009单元中保存0x02。
要注意的是,c语言中,针对不同的处理器,整形所占用的基本存储单元是不一样的。