C语言实现原反补相互转换
1.原码、反码、补码
符号位:一个有符号定点数的最高位为符号位,0是正,1是负。
原码:最高位为符号位,其余各位为数值本身的绝对值。
反码:正数的反码与原码相同,负数的反码,符号位为1,其余位对原码取反。
补码:正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。
2.举例:
数据 | 原码 | 反码 | 补码 |
---|---|---|---|
1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
0 | 0000 0000 | 0000 0000 | 0000 0000 |
-26 | 10000000000000000000000000011010 | 11111111111111111111111111100101 | 11111111111111111111111111100110 |
3.代码实现
#include <stdio.h>
/* 根据要判断的符号位来更改下面的移位操作! */
/* 原码转补码 */
int original_2_complement(int x )
{
int y ,res;
y = x >> 18 ;
res = x;
/* 负数 */
if(y)
{
res = (~x + 1) - (1<<19) ;
res = -(res & 0x3ffff);
}
return res;
}
int main(void)
{
int yuanma;
yuanma = get(0x3142f);
printf("%d = yuanma\r\n",yuanma);
return 0;
}
4.原码和补码的使用
原码:使用原码来进行计算
补码:使用补码来进行存储