问个C语言左移<<的问题

[复制链接]
3397|26
 楼主| zjwyczj 发表于 2013-5-31 20:53 | 显示全部楼层 |阅读模式
本帖最后由 zjwyczj 于 2013-6-1 20:31 编辑

随便写下啦,这个问题比较弱智,别取笑我啊
uchar a=0x1;
uchar b=0x2;
uchar c=0x3;
uchar d=0x3;
void fun(void)
{
   uint i;
   i=a|(b<<8)|(c<<16) |(d<<24)  ;
}
i等于多少,why????
疑惑是abcd是8位的,移位了8位应该全0了??
但是实际上是a,b,c,d变成32位的(跟赋值左式一样??)?再移位??
求解、
hwk612167 发表于 2013-5-31 22:01 | 显示全部楼层
确定?
uchar 是否 unsigned char,
b应该等于0,并不是你说的那样。
huangxz 发表于 2013-6-1 09:57 | 显示全部楼层
这个写法在一般的编译器编译过程中会出警告的,属于不规范的,不安全的代码。
不管结果是啥,都不值得庆幸,因为这样的代码在实际中就不应该出现
 楼主| zjwyczj 发表于 2013-6-1 20:32 | 显示全部楼层
huangxz 发表于 2013-6-1 09:57
这个写法在一般的编译器编译过程中会出警告的,属于不规范的,不安全的代码。
不管结果是啥,都不值得庆幸,因 ...

确定?我看到很多程序中有这种用法,我也挺疑惑的
SunFans 发表于 2013-6-2 09:08 | 显示全部楼层
虽说可能有些编译器不会有问题,但还是严重建议a、b、c、d和i同一类型……
lelee007 发表于 2013-6-2 09:29 | 显示全部楼层
LZ用的什么编译器?这编译器真是烂得跟坨屎一样
nametony 发表于 2013-6-2 12:16 | 显示全部楼层
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不仅麻烦, 看起来更累. 关键是C语言规定小于INT的类型运算前都要转换为INT(或UINT)
lcdi 发表于 2013-6-2 13:32 | 显示全部楼层
一般来说编译器跟据运算优先级来确定数据类型的匹配,但有时候自己并不是完全了解转换规则,所以和编译器的理解会有不一样。而且不同编译器也有不一定相同的规则。

最好自己来控制类型转换,事先指定。
dld2 发表于 2013-6-2 14:15 | 显示全部楼层
自动类型转换。请查看编译器首次。
 楼主| zjwyczj 发表于 2013-6-2 17:32 | 显示全部楼层
lelee007 发表于 2013-6-2 09:29
LZ用的什么编译器?这编译器真是烂得跟坨屎一样

也不能这么说的,用的 Eclipse
 楼主| zjwyczj 发表于 2013-6-2 17:34 | 显示全部楼层
nametony 发表于 2013-6-2 12:16
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不 ...

有这个规定吗?我查查看,哎,楼主我基础不行,所以问这种问题
 楼主| zjwyczj 发表于 2013-6-2 17:35 | 显示全部楼层
lcdi 发表于 2013-6-2 13:32
一般来说编译器跟据运算优先级来确定数据类型的匹配,但有时候自己并不是完全了解转换规则,所以和编译器的 ...

恩,有道理,只是有时候加强制转换的确有些麻烦
 楼主| zjwyczj 发表于 2013-6-2 17:40 | 显示全部楼层
nametony 发表于 2013-6-2 12:16
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不 ...

哥们说的是java吧。c中有这个规定?
 楼主| zjwyczj 发表于 2013-6-2 17:52 | 显示全部楼层
本帖最后由 zjwyczj 于 2013-6-2 18:47 编辑

:)
 楼主| zjwyczj 发表于 2013-6-2 17:55 | 显示全部楼层
本帖最后由 zjwyczj 于 2013-6-2 18:48 编辑

:)
 楼主| zjwyczj 发表于 2013-6-2 18:08 | 显示全部楼层
本帖最后由 zjwyczj 于 2013-6-2 18:48 编辑

:)
 楼主| zjwyczj 发表于 2013-6-2 18:34 | 显示全部楼层
学习了,谭浩强老师的c语言书上是降到了4)    char 型和  short  型参与运算时,必须先转换成  int 型。
lelee007 发表于 2013-6-2 21:09 | 显示全部楼层
zjwyczj 发表于 2013-6-2 17:32
也不能这么说的,用的 Eclipse

Eclipse可不做编译器哈,只是个IDE开发平台而已,里边一般都会集成有编译器
huangxz 发表于 2013-6-2 22:41 | 显示全部楼层
zjwyczj 发表于 2013-6-2 18:34
学习了,谭浩强老师的c语言书上是降到了4)    char 型和  short  型参与运算时,必须先转换成  int 型。 ...

int 类型在不同的架构,不同的编译器里面的解释是有差异的,有些是16位的,有些是32位的,
jlass 发表于 2013-6-3 09:27 | 显示全部楼层
结果=0x03030201应该没有问题。一般的编译器应该都是这个结果。
不过确实写得不规范

您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

204

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部