打印

C位运算(取反)的怪事

[复制链接]
2739|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilikerome|  楼主 | 2012-4-27 11:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ilikerome 于 2012-4-27 11:15 编辑

今个碰到个百思不得其解的事情,代码如下:

typedef unsigned short int USINT;

getbits()
{
USINT z=~0;
z=(z>>14);  
printf(“%o”,z);
}

结果为:3

getbits()
{
USINT z=0;
z=((~z)>>14);  
printf(“%o”,z);
}

结果为:177777

这是为什么啊?请大家指教,谢谢。

是在xp\visual C++ 6.0上出现的。

相关帖子

沙发
airwill| | 2012-4-27 11:13 | 只看该作者
这是什么处理器, 什么编译器下的情况, 测试一下.

使用特权

评论回复
板凳
ilikerome|  楼主 | 2012-4-27 11:15 | 只看该作者
这是什么处理器, 什么编译器下的情况, 测试一下.
airwill 发表于 2012-4-27 11:13

是在xp\visual C++ 6.0上出现的。

使用特权

评论回复
地板
ningling_21| | 2012-4-27 11:58 | 只看该作者
发错版块了?

使用特权

评论回复
5
xlsbz| | 2012-4-27 12:06 | 只看该作者
楼主的C语言不扎实   基本功比较差。

取反并且移位  必须强制   。否则处理器类型不一样  程序不通用

使用特权

评论回复
6
ilikerome|  楼主 | 2012-4-27 13:00 | 只看该作者
楼主的C语言不扎实   基本功比较差。

取反并且移位  必须强制   。否则处理器类型不一样  程序不通用
xlsbz 发表于 2012-4-27 12:06


取反并且移位  必须强制   。----是什么意思?

使用特权

评论回复
7
uc_c++| | 2012-4-27 13:01 | 只看该作者
本帖最后由 uc_c++ 于 2012-4-27 13:04 编辑

整型提升。

标准C规定 ~运算符的操作数至少为int,不满int,提升至int或者unsigned int,再参与运算。

换句话说:short,unsigned short和char,unsigned char,signed char根本就没有~运算。
short,unsigned short和char,unsigned char,signed char要想参与运算,必须由编译器提升至int或者unsigned int,才能参与运算。

这个提升是由编译器自动完成的,叫做 整型提升

unsigned short z=0;
~z等价于(~((int)z)),结果为(int)-1

使用特权

评论回复
8
ilikerome|  楼主 | 2012-4-27 13:26 | 只看该作者
整型提升。

标准C规定 ~运算符的操作数至少为int,不满int,提升至int或者unsigned int,再参与运算。

换句话说:short,unsigned short和char,unsigned char,signed char根本就没有~运算。
short,unsigned short和 ...
uc_c++ 发表于 2012-4-27 13:01


还是这位解释的清楚,非常感谢。

使用特权

评论回复
9
ilikerome|  楼主 | 2012-4-27 13:31 | 只看该作者
楼主的C语言不扎实   基本功比较差。

取反并且移位  必须强制   。否则处理器类型不一样  程序不通用
xlsbz 发表于 2012-4-27 12:06


查看了下你的其他帖子,觉得你有点毒舌,且回贴文不对题,RP有问题。

使用特权

评论回复
10
zhaofy521| | 2012-4-27 18:12 | 只看该作者
整型运算都要进行整形提升,然后再截短

使用特权

评论回复
11
Ryanhsiung| | 2012-4-27 19:27 | 只看该作者
学习

使用特权

评论回复
12
frlop| | 2012-4-27 20:09 | 只看该作者
学习了。

使用特权

评论回复
13
xlsbz| | 2012-4-28 08:14 | 只看该作者
9# ilikerome
你真个**  我真心实意为你回答问题。即便答错了,你也不能说我坏话啊。难道我欠你钱么?

使用特权

评论回复
14
xlsbz| | 2012-4-28 08:21 | 只看该作者
6# ilikerome
2楼大侠已经给你提示了,就是编译器不一样  得出的结果可能不一样。

z=((~z)>>14);


假设  一个变量  x = 0x5A,那么16位编译器  ~x=0xffa5   ,32位编译器 ~x=0xfffffa5




可能我说的是有问题  但是你他妈的骂人就不对了  FU  CK   

使用特权

评论回复
15
logokfu| | 2012-4-28 08:58 | 只看该作者
LS的消消气,我们都是来讨论问题的。:lol

使用特权

评论回复
16
xlsbz| | 2012-4-28 09:02 | 只看该作者
15# **kfu
呵呵  我确实有时候言语过激  我会慢慢改正的

使用特权

评论回复
17
ilikerome|  楼主 | 2012-4-28 21:51 | 只看该作者
6# ilikerome  
2楼大侠已经给你提示了,就是编译器不一样  得出的结果可能不一样。

z=((~z)>>14);


假设  一个变量  x = 0x5A,那么16位编译器  ~x=0xffa5   ,32位编译器 ~x=0xfffffa5




可能我说的是有问题  ...
xlsbz 发表于 2012-4-28 08:21

说你RP低算给你面子了,而且我还认真看下你以前的帖子才下的结论。
说你的回答,文不对题,错了吗?
不懂就别乱说,这个也不懂?
你的这几个回帖再次,毫无疑问、充分明确,的证明了我的以上结论。

使用特权

评论回复
18
xlsbz| | 2012-4-29 14:26 | 只看该作者
17# ilikerome


你个煞笔

使用特权

评论回复
19
le062| | 2012-4-30 14:52 | 只看该作者
学习了

使用特权

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

本版积分规则

个人签名:创造价值是我们学习知识的目的. 知识是创造价值的手段而非全部.

18

主题

516

帖子

0

粉丝