反码问题!
下面程序当输入10时,为什么会输出-11,请指点
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void)
{
int num,reverse;
scanf("%d",&num);
reverse=~num;
printf("reverse=%d\n",reverse);
getch();
exit(0);
}
下面程序当输入10时,为什么会输出-11,请指点
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void)
{
int num,reverse;
scanf("%d",&num);
reverse=~num;
printf("reverse=%d\n",reverse);
getch();
exit(0);
}
10 → 0000 0000 0000 1010 (假设int为两字节)
~10→ 1111 1111 1111 0101 (补码)→1000 0000 0000 1011 (原码-11)
10 → 0000 0000 0000 1010 (假设int为两字节)
~10→ 1111 1111 1111 0101 (补码)→1000 0000 0000 1011 (原码-11)
1111 1111 1111 0101 (补码)→1000 0000 0000 1011 (原码-11)
这是怎么回事?
输入10(0000 0000 0000 1010)时,~按位非,
-> 1111 1111 1111 0101
计算机中第一位是符号位,1表示这个数是负数,而负数是按补码的形式进行存储的
例如-1的原码是10 00 00 00 00 00 00 01
而-1反码变为11 11 11 11 11 11 11 10
反码再加1即为补码即
11 11 11 11 11 11 11 11
反过来,计算机输出的是原码,就是-1了