C中有关i++的问题

荣子3507 2015-01-13 11:45:17
今天碰到了有关i++的一个奇怪的问题,和自己以前认为的完全不一样。希望能得到大家的指点。
代码如下

#include <stdio.h>
#include <types.h>

main(){
unsigned char array[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee};
u_int8_t tmp0;
u_int16_t tmp1;
int i;
i = 0;
tmp1 = array[i++] | ((u_int16_t)array[i++] << 8);
printf("tmp1 = %04x\n", tmp1);
}

原本想着运行结果为"tmp1 = bbaa", 可实际的运行结果为"tmp1 = aaaa",这是为什么呢?运行环境为32bit ubuntu
要想得到"tmp1 = bbaa"的运行结果,需要对代码作如下修改

#include <stdio.h>
#include <types.h>

main(){
unsigned char array[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee};
u_int8_t tmp0;
u_int16_t tmp1;
int i;
i = 0;
tmp0 = array[i++];
tmp1 = (u_int16_t)(array[i++] << 8);
tmp1 = tmp0 | tmp1;
printf("tmp1 = %04x\n", tmp1);
}


将array[]改为char型数组,运行结果变为"tmp1 = ffaa",这是为什么呢?具体代码如下

#include <stdio.h>
#include <types.h>

main(){
char array[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee};
u_int8_t tmp0;
u_int16_t tmp1;
int i;
i = 0;
// tmp0 = array[i++];
// tmp1 = (u_int16_t)(array[i++] << 8);
// tmp1 = tmp0 | tmp1;
tmp1 = array[i++] | (((u_int16_t)array[i++]) << 8);
printf("tmp1 = %04x\n", tmp1);
}
...全文
231 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2015-01-15
  • 打赏
  • 举报
回复
tmp1 = array[i++] | ((u_int16_t)array[i++] << 8); 这种语法要不的,不同的编译器可能会有不同的解释,一般是tmp1 = array[i | ((u_int16_t)array[i+1] << 8);的效果 改成: tmp1 = array[i] | ((u_int16_t)array[i] << 8); i++;
mangoalx 2015-01-14
  • 打赏
  • 举报
回复
temp1=aaaa, 看起来是c语言处理算式中的顺序和你想的不一样,先把所有操作数据取出,最后才作++ char 数组temp1=ffaa,这是因为你定义的是有符号字符和16位整形,这样在赋值时要做符号扩展,正好你的数据是负数,所以高8位全部扩展成了1 个人认为写程序还是以清晰简单为好,这些容易困惑的写法应摒弃不用,研究它也没有多大意义

1,076

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧