X 我知道了TIPS:左右滑动导航栏可以查看更多栏目
#include <stdio.h>
void main()
{
int i;
unsigned int j;
i=~0;
j=~0;
printf(“i=%d,j=%d”,i,j);
}
为什么i=-1,j=-1?
(-1怎么来的?)
>> 本文固定链接: http://www.vcgood.com/archives/3124
>> 转载请注明: yqqu 2009年03月31日 于 C语言帝国 发表
要解决这个问题首先要知道什么是原码、反码和补码,这些东西书上都有,可以自己去看。需要记得的是:
1.有符号整数在内存中是按补码的形式存放的(0 — 正,1 — 负);无符号整数只能是正数,在计算机中是以绝对值形式存放的。
2.~是按位取反运算符
一个整数有正负之分,在计算机中 0 也有 +0 和 -0 之分(IEEE标准),默认情况下为 +0
0(10进制)= 00000000
按位取反后 ~0(10进制) = 11111111
由于最高位为1,表示负数,所以二进制形式 11111111 表示一个负数的补码
那么这个负数是什么呢?我们再来转换一下
将其转化为反码为 11111111 – 1 = 11111110
再转化为原码(符号位不变,其余按位取反):10000001
所以 100000001(二进制)= -1
以上仅作参考,如有错误请指正。
呵呵……
你必须先 登录才能发表评论。
要解决这个问题首先要知道什么是原码、反码和补码,这些东西书上都有,可以自己去看。需要记得的是:
1.有符号整数在内存中是按补码的形式存放的(0 — 正,1 — 负);无符号整数只能是正数,在计算机中是以绝对值形式存放的。
2.~是按位取反运算符
一个整数有正负之分,在计算机中 0 也有 +0 和 -0 之分(IEEE标准),默认情况下为 +0
0(10进制)= 00000000
按位取反后 ~0(10进制) = 11111111
由于最高位为1,表示负数,所以二进制形式 11111111 表示一个负数的补码
那么这个负数是什么呢?我们再来转换一下
将其转化为反码为 11111111 – 1 = 11111110
再转化为原码(符号位不变,其余按位取反):10000001
所以 100000001(二进制)= -1
以上仅作参考,如有错误请指正。
呵呵……