c语言 i=10 j=~i j的值等于11????为什么??? 请高手指点

来源:百度知道 编辑:UC知道 时间:2024/09/20 16:40:08
请说的详细一点 谢谢

结果应该为-11。
数字在计算机中都是以补码存放的。
10的补码为00000000 00000000 00000000 00001010
~i,即取反,故得:11111111 11111111 11111111 11110101
这是在计算机中存放得值,是一个数得补码,那么这个补码所对应的原码是多少呢(补码转源码的知识,源码=补码取反再加1)
符号位保持不变,1表示负号,即:
10000000 00000000 00000000 00001010 +1,得到
10000000 00000000 00000000 00001011,即:-11

i = 10;
编译器默认为 int型
二楼正解。
补充二点:
1、目前的兼容机上一般是正数用原码表示,负数用补码表示。所以二楼说的原码=补码取反再加1 是指负数,符号位
2、这是平台相关的,所以还要考虑到程序的移植性降低。

如果你定义为 unsigned int i = 10; 取反就是直接对应原码,因为没有符号位。

正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码

你用的是位操作符.位操作符与变量类型有很大关系的,会直接影响最后的结果.请给出i,j的类型.而且好象算了下,不管是什么类型,取反后都不会一个10,一个11.你最好多贴一些代码出来,才能帮你分析,可能你还有什么地方弄错了,才最后会出现你现在的这种情况

我觉得你应该把完整的程序给出来,光看你写的这个连具体是啥都看不清,i前面那个是 - 还是什么啊?

i=10的十六进制数是000a,二进制数是0000 0000 0000 1010(由于int型是两个字节的,所以二进制长16位)。
对i按位求反后(即j=~i),j在计算机存储是二进制变为1111 1111 1111 0101.由于整数在计算机中是按补码表示的,所以要将计算机中的值要变为平时我们看见的十进制要进行转化。
首先要懂得计算机是怎