C位运算(取反)的怪事

[复制链接]
3641|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 | 显示全部楼层
发错版块了?
xlsbz 发表于 2012-4-27 12:06 | 显示全部楼层
楼主的C语言不扎实   基本功比较差。

取反并且移位  必须强制   。否则处理器类型不一样  程序不通用
 楼主| ilikerome 发表于 2012-4-27 13:00 | 显示全部楼层
楼主的C语言不扎实   基本功比较差。

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


取反并且移位  必须强制   。----是什么意思?
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
 楼主| 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


还是这位解释的清楚,非常感谢。
 楼主| ilikerome 发表于 2012-4-27 13:31 | 显示全部楼层
楼主的C语言不扎实   基本功比较差。

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


查看了下你的其他帖子,觉得你有点毒舌,且回贴文不对题,RP有问题。
zhaofy521 发表于 2012-4-27 18:12 | 显示全部楼层
整型运算都要进行整形提升,然后再截短
Ryanhsiung 发表于 2012-4-27 19:27 | 显示全部楼层
frlop 发表于 2012-4-27 20:09 | 显示全部楼层
学习了。
xlsbz 发表于 2012-4-28 08:14 | 显示全部楼层
9# ilikerome
你真个**  我真心实意为你回答问题。即便答错了,你也不能说我坏话啊。难道我欠你钱么?
xlsbz 发表于 2012-4-28 08:21 | 显示全部楼层
6# ilikerome
2楼大侠已经给你提示了,就是编译器不一样  得出的结果可能不一样。

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


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




可能我说的是有问题  但是你他妈的骂人就不对了  FU  CK   
logokfu 发表于 2012-4-28 08:58 | 显示全部楼层
LS的消消气,我们都是来讨论问题的。:lol
xlsbz 发表于 2012-4-28 09:02 | 显示全部楼层
15# **kfu
呵呵  我确实有时候言语过激  我会慢慢改正的
 楼主| 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低算给你面子了,而且我还认真看下你以前的帖子才下的结论。
说你的回答,文不对题,错了吗?
不懂就别乱说,这个也不懂?
你的这几个回帖再次,毫无疑问、充分明确,的证明了我的以上结论。
xlsbz 发表于 2012-4-29 14:26 | 显示全部楼层
17# ilikerome


你个煞笔
le062 发表于 2012-4-30 14:52 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

18

主题

516

帖子

0

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