打印

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

[复制链接]
2090|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
这个写法在一般的编译器编译过程中会出警告的,属于不规范的,不安全的代码。
不管结果是啥,都不值得庆幸,因 ...

确定?我看到很多程序中有这种用法,我也挺疑惑的

使用特权

评论回复
5
SunFans| | 2013-6-2 09:08 | 只看该作者
虽说可能有些编译器不会有问题,但还是严重建议a、b、c、d和i同一类型……

使用特权

评论回复
6
lelee007| | 2013-6-2 09:29 | 只看该作者
LZ用的什么编译器?这编译器真是烂得跟坨屎一样

使用特权

评论回复
7
nametony| | 2013-6-2 12:16 | 只看该作者
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不仅麻烦, 看起来更累. 关键是C语言规定小于INT的类型运算前都要转换为INT(或UINT)

使用特权

评论回复
8
lcdi| | 2013-6-2 13:32 | 只看该作者
一般来说编译器跟据运算优先级来确定数据类型的匹配,但有时候自己并不是完全了解转换规则,所以和编译器的理解会有不一样。而且不同编译器也有不一定相同的规则。

最好自己来控制类型转换,事先指定。

使用特权

评论回复
9
dld2| | 2013-6-2 14:15 | 只看该作者
自动类型转换。请查看编译器首次。

使用特权

评论回复
10
zjwyczj|  楼主 | 2013-6-2 17:32 | 只看该作者
lelee007 发表于 2013-6-2 09:29
LZ用的什么编译器?这编译器真是烂得跟坨屎一样

也不能这么说的,用的 Eclipse

使用特权

评论回复
11
zjwyczj|  楼主 | 2013-6-2 17:34 | 只看该作者
nametony 发表于 2013-6-2 12:16
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不 ...

有这个规定吗?我查查看,哎,楼主我基础不行,所以问这种问题

使用特权

评论回复
12
zjwyczj|  楼主 | 2013-6-2 17:35 | 只看该作者
lcdi 发表于 2013-6-2 13:32
一般来说编译器跟据运算优先级来确定数据类型的匹配,但有时候自己并不是完全了解转换规则,所以和编译器的 ...

恩,有道理,只是有时候加强制转换的确有些麻烦

使用特权

评论回复
13
zjwyczj|  楼主 | 2013-6-2 17:40 | 只看该作者
nametony 发表于 2013-6-2 12:16
结果=0x03030201
我认为这个写法是标准的, 理由是: 不同类型在一个表达式还是经常出现的, 若都加强制转换不 ...

哥们说的是java吧。c中有这个规定?

使用特权

评论回复
14
zjwyczj|  楼主 | 2013-6-2 17:52 | 只看该作者
本帖最后由 zjwyczj 于 2013-6-2 18:47 编辑

:)

使用特权

评论回复
15
zjwyczj|  楼主 | 2013-6-2 17:55 | 只看该作者
本帖最后由 zjwyczj 于 2013-6-2 18:48 编辑

:)

使用特权

评论回复
16
zjwyczj|  楼主 | 2013-6-2 18:08 | 只看该作者
本帖最后由 zjwyczj 于 2013-6-2 18:48 编辑

:)

使用特权

评论回复
17
zjwyczj|  楼主 | 2013-6-2 18:34 | 只看该作者
学习了,谭浩强老师的c语言书上是降到了4)    char 型和  short  型参与运算时,必须先转换成  int 型。

使用特权

评论回复
18
lelee007| | 2013-6-2 21:09 | 只看该作者
zjwyczj 发表于 2013-6-2 17:32
也不能这么说的,用的 Eclipse

Eclipse可不做编译器哈,只是个IDE开发平台而已,里边一般都会集成有编译器

使用特权

评论回复
19
huangxz| | 2013-6-2 22:41 | 只看该作者
zjwyczj 发表于 2013-6-2 18:34
学习了,谭浩强老师的c语言书上是降到了4)    char 型和  short  型参与运算时,必须先转换成  int 型。 ...

int 类型在不同的架构,不同的编译器里面的解释是有差异的,有些是16位的,有些是32位的,

使用特权

评论回复
20
jlass| | 2013-6-3 09:27 | 只看该作者
结果=0x03030201应该没有问题。一般的编译器应该都是这个结果。
不过确实写得不规范

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

204

帖子

2

粉丝