一 . 源码、反码、补码
源码:整形的源码是4个字节,即32个比特位
源码的第一个数是符号位,0表示为正数,1是为负数
如:a = 10
00000000000000000000000000001010 - 源码
2^3 + 2^1 =10
00000000000000000000000000001010 - 反码
00000000000000000000000000001010 - 补码
正整数的源码、补码、反码是一样的
b = -10
10000000000000000000000000001010 - 源码
111111111111111111111111111111110101 - 反码 (符号位不变,其余位都与源码相反)
111111111111111111111111111111110110 - 补码 (符号位不变,反码+1)
补码->源码
1. 减1取反
111111111111111111111111111111110110 - 补码
111111111111111111111111111111110101 - 减1
10000000000000000000000000001010 - 源码(取反)
2. 取反加1
111111111111111111111111111111110110 - 补码
10000000000000000000000000001001 - 取反
10000000000000000000000000001010 - 源码(加1)
二 . 运算
#include <stdio.h>
int main()
{
int a = 1;
int b = -1;
printf("%d\n",a+b);
return 0;
}
计算机用补码计算
// 10000000000000000000000000000001 —— -1的源码
// 11111111111111111111111111111110 —— -1的反码
// 11111111111111111111111111111111 —— -1的补码
// 00000000000000000000000000000001 —— 1的补码
// 00000000000000000000000000000000 ->0(a+b)
源码的计算是错误的
// 10000000000000000000000000000001 —— -1的源码
// 00000000000000000000000000000001 —— 1的源码
// 10000000000000000000000000000010 -> -2
截断、整形提升:有符号数提升时,按符号位提升;无符号数提升时,前面全部补0
#include <stdio.h>
int main()
{
char a = -1; //补码截断,取后8位
// 10000000000000000000000000000001 - -1源码
// 11111111111111111111111111111110 - -1反码
// 11111111111111111111111111111111 - -1补码
// 11111111 - a
signed char b = -1;
// 11111111111111111111111111111111 - -1补码
// 11111111 - b
unsigned char c = -1;
// 11111111111111111111111111111111 - -1补码
// 11111111 - c
printf("a=%d b=%d c=%d\n",a,b,c);
//要打印出整形,所以要整形提升
// a,b相同
// 11111111111111111111111111111111 - 补码(有符号数提升时,按符号位提升)
// 11111111111111111111111111111110 - 反码
// 10000000000000000000000000000001 - 源码
//无符号数提升时,前面全部补0
// 11111111 - c
// 00000000000000000000000011111111 - 补码,也是源码
return 0;
}
#include <stdio.h>
int main()
{
int i = -20;
// 10000000000000000000000000010100 -源码
// 11111111111111111111111111101011 -反码
// 11111111111111111111111111101100 -补码
unsigned char j = 10;
// 00000000000000000000000000001010 -源码(补码)
printf("%d\n",i+j); //-10
// 11111111111111111111111111101100 -补码
// 00000000000000000000000000001010 -补码
// 11111111111111111111111111110110 -补码
// 10000000000000000000000000001001 -反码
// 10000000000000000000000000001010 -源码
return 0;
}