位运算的问题……

kero77 2008-03-03 03:40:46
int i=10;
cout<<~i<<endl;
为什么得到的结果是-11
我用的VS.net2005编译器
是编译器的问题吗?

i:0000 0000 0000 0000 0000 0000 0000 1010
~i:1111 1111 1111 1111 1111 1111 1111 0101
为什么是-11呢!怎么得到的呢!

我做了以下两种尝试
(1)
cout<<(~i)<<endl;
(2)
short i=10;
结果都是-11
...全文
97 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
无病呻吟2 2008-03-04
  • 打赏
  • 举报
回复
计算机存储的是补码
最高位为符号位~~~
int i
默认是有符号的。。。
ttkk_2007 2008-03-04
  • 打赏
  • 举报
回复
1111 1111 1111 1111 1111 1111 1111 0101 这事补码
要变成源码,先减一,再取反
减一:1111 1111 1111 1111 1111 1111 1111 0100
取反:1000 0000 0000 0000 0000 0000 0000 1011
  • 打赏
  • 举报
回复
事情是这样的
10 的 二进制码 为0000 0000 0000 0000 0000 0000 0000 1010
至于为什么cout < <(~i) < <endl; 的结果是-11可以这样看

因为负数的二进制是其相反数的二进制码取反加一
11 的 二进制是 0000 0000 0000 0000 0000 0000 0000 1011
所以-11 的二进制 是 1111 1111 1111 1111 1111 1111 1111 0101
在对上述结果取反 就是~10的结果 也就是

0000 0000 0000 0000 0000 0000 0000 1010

END
makewater 2008-03-03
  • 打赏
  • 举报
回复
计算机内部是补码表示的,你说的哪个东东是补码.
hai040 2008-03-03
  • 打赏
  • 举报
回复
用hex居然直接显示原码ffff fff5

int main()
{
int i = 10;
cout<<hex<<~i;

return 0;
}
Chappell 2008-03-03
  • 打赏
  • 举报
回复
求反之后等到补码,需要转换为原码
符号位不变,按位求反+1,即可得到原码

~i:1111 1111 1111 1111 1111 1111 1111 0101 (补码)
=>-000 0000 0000 0000 0000 0000 0000 1011
=>-11
Chappell 2008-03-03
  • 打赏
  • 举报
回复
二进制
234= 0000 0000 1110 1010
取反=1111 1111 0001 0101(补码,最高1表示负号)
= -000 0000 1110 1011
=-235
%x表示无符号数
1111 1111 0001 0101
= f f 1 5
Chappell 2008-03-03
  • 打赏
  • 举报
回复
int i;默认是signed
转换之后第一位是符号位为负数
baihacker 2008-03-03
  • 打赏
  • 举报
回复
-i = ~i + 1
CQZE 2008-03-03
  • 打赏
  • 举报
回复
有符号型的呀.
变成负数就是 -(i + 1)嘛
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-03 03:40
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下