求助高手,一个令我郁闷了一天的问题

2019-07-16 00:11发布

main()
{
     unsigned char a[4]= {0x12, 0x34, 0x56, 0x78};
     unsigned long i, j;
     i = (a[0] << 24) + (a[1] << 16) + (a[2] << 8) + a[3];
     j = a[0] * 0x1000000 + a[1] * 0x10000 + a[2] * 0x100 + a[3];
     return 0;
}

我以为 i = 0x12345678, 实际上 i = 0x00005678, 查了半天错,最后改成了第二个式子才得一通过
实在是想不明白,为什么i的值只有低16位

无标题.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
k331922164
1楼-- · 2019-07-16 01:21
应该是数据类型的范围限制了。
sxxyyanjj
2楼-- · 2019-07-16 01:49
你把数组a定义成long型的就知道哪错了
那低头一笑的温
3楼-- · 2019-07-16 07:27
sxxyyanjj 发表于 2013-6-7 21:16
你把数组a定义成long型的就知道哪错了

我想知道的是,为什么用char型不行
dry55
4楼-- · 2019-07-16 12:59
溢出               
那低头一笑的温
5楼-- · 2019-07-16 17:24
 精彩回答 2  元偷偷看……
sxxyyanjj
6楼-- · 2019-07-16 19:35
在移位运算时,byte、short和char类型移位后的结果会变成int类型,也就是16位,移位24位和16位已经溢出了,只保留低16位,所以都是0x00000000,移位8位就是0x5600,所以最后结果是0x00005678。而第二条语句中因为已经有long型变量参与运算,结果会自动变为long型不会溢出,所以结果正确

评分

参与人数 1 +2 积分 +2 收起 理由 dongyumin + 2 + 2 助人为乐~给分~

查看全部评分

一周热门 更多>