#include "stdio.h"
#include <stdlib.h>
typedef short int16_t;
int main()
{
FILE *fp = fopen("a.txt","w+");
for(int16_t d = -10; d<=10; d++)
{
int level = d;//注意:选择更高位宽保存
int sign = level>>31;//获取符号位(值为-1或0)
int x = (level + sign) ^ sign;//获取绝对值
int y = (x ^ sign) - sign;//补回符号位
fprintf(fp,"d = %8d level = %8d sign = %3d x = %8d y = %8d\n",d,level,sign,x,y);
}
fclose(fp);
return 0;
}
结果:
d = -10 level = -10 sign = -1 x = 10 y = -10
d = -9 level = -9 sign = -1 x = 9 y = -9
d = -8 level = -8 sign = -1 x = 8 y = -8
d = -7 level = -7 sign = -1 x = 7 y = -7
d = -6 level = -6 sign = -1 x = 6 y = -6
d = -5 level = -5 sign = -1 x = 5 y = -5
d = -4 level = -4 sign = -1 x = 4 y = -4
d = -3 level = -3 sign = -1 x = 3 y = -3
d = -2 level = -2 sign = -1 x = 2 y = -2
d = -1 level = -1 sign = -1 x = 1 y = -1
d = 0 level = 0 sign = 0 x = 0 y = 0
d = 1 level = 1 sign = 0 x = 1 y = 1
d = 2 level = 2 sign = 0 x = 2 y = 2
d = 3 level = 3 sign = 0 x = 3 y = 3
d = 4 level = 4 sign = 0 x = 4 y = 4
d = 5 level = 5 sign = 0 x = 5 y = 5
d = 6 level = 6 sign = 0 x = 6 y = 6
d = 7 level = 7 sign = 0 x = 7 y = 7
d = 8 level = 8 sign = 0 x = 8 y = 8
d = 9 level = 9 sign = 0 x = 9 y = 9
d = 10 level = 10 sign = 0 x = 10 y = 10
绝对值举例:
5: 原码:00000000 00000000 00000000 00000101
5: 反码:00000000 00000000 00000000 00000101
5: 补码:00000000 00000000 00000000 00000101
符号位 sign = 0
(5+0)^0 = 5
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000000
-------------------------------------
00000000 00000000 00000000 00000101
-5: 原码:10000000 00000000 00000000 00000101
-5: 反码:11111111 11111111 11111111 11111010
-5: 补码:11111111 11111111 11111111 11111011
-6: 原码:10000000 00000000 00000000 00000110
-6: 反码:11111111 11111111 11111111 11111001
-6: 补码:11111111 11111111 11111111 11111010
符号位 sign = 0
(-5+ (-1))^(-1) = 5
11111111 11111111 11111111 11111010 (-6)
11111111 11111111 11111111 11111111
-------------------------------------
00000000 00000000 00000000 00000101
加符号位举例:
5: 原码:00000000 00000000 00000000 00000101
5: 反码:00000000 00000000 00000000 00000101
5: 补码:00000000 00000000 00000000 00000101
1. 符号位 sign = 0
(5^0) - 0 = 5
2. 符号位 sign = -1
(5^-1) - (-1) = -5
00000000 00000000 00000000 00000101
11111111 11111111 11111111 11111111
-------------------------------------
11111111 11111111 11111111 11111010 (相当于取反操作)
11111111 11111111 11111111 11111010 + 1
=11111111 11111111 11111111 11111011 (补码-5)
11111111 11111111 11111111 11111010 (反码-5)
00000000 00000000 00000000 00000101 (原码-5)