如下代码,在进行强制类型转换时,会导致打印出来的数据不是想要的:
1 #include <stdio.h> 2 3 void AddFunc (unsigned int a, unsigned int b, unsigned int * c) 4 { 5 *c = a + b; 6 } 7 8 int main(void) 9 { 10 unsigned char e = 100; 11 unsigned char f = 200; 12 unsigned char g = 0; 13 unsigned int p =0; 14 15 AddFunc((unsigned int)e,(unsigned int)f,(unsigned int *)&g); 16 printf("%d\n",g); 17 18 return 0; 19 }
打印出来的结果是:44
解析:可以添加如下打印语句帮助理解:
1 printf("%d\n",&g); \\ 打印值为 1244988 2 printf("%d\n",(unsigned int *)&g); \\ 打印值也为 1244988 3
如下图所示,300这个整数占了两个Bytes,char型地址已经不够了,高位的1占了下一个地址,使用unsigned int型空间够大了。但是变量g依然是unsigned char型,所以打印时只打了最低的一个Bytes,即44。
高地址 <-- 1244988
0000 0000 | 0000 0000 | 0000 0001 | 0010 1100 |
使用如下代码,可以打印正确值:
1 #include <stdio.h> 2 3 void AddFunc (unsigned int a, unsigned int b, unsigned int * c) 4 { 5 *c = a + b; 6 } 7 8 int main(void) 9 { 10 unsigned char e = 100; 11 unsigned char f = 200; 12 unsigned int p =0; 13 14 AddFunc((unsigned int)e,(unsigned int)f,&p); 15 printf("%d\n",p); 16 17 return 0; 18 }
打印值:300