C语言怎么求得一个32位数的原码、补码、反码、和移码?
由于浮点数还需要考虑浮点数的存储方式,所以目前暂时提供正数的补码、反码、移码
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void showvaluebin(int bits, int value)
{
int i;
for(i = bits-1; i >=0; i--)
{
if(value & (1 << i))
{
printf("1");
}
else
{
printf("0");
}
}
}
int getsign(int inum)//获取符号位
{
int isign = inum >> 31;
if(isign)//高位为1为负数
return 1;
else
return 0;
}
int complemental_code(int inum)//补码
{
int isign = getsign(inum);
if(isign)
{
inum = ones_complement_code(inum)+1;
return inum;
}
else
{
return inum;
}
}
int ones_complement_code(int inum)//反码
{
int isign = getsign(inum);
if(isign)//为负数
{
inum = ~inum;
inum |= 1 << 31;
return inum;
}
else
{
return inum;
}
}
int frame_shift(int inum)//移码
{
int isign = getsign(inum);
if(isign)
{
inum &= ~(1 << 31);
return inum;
}
else
{
inum |= 1 << 31;
return inum;
}
}
int true_code(int inum)
{
int isign = getsign(inum);
if(isign)//负数在内存中是以补码的形式存在
{
inum = complemental_code(inum);
return inum;
}
else
{
return inum;
}
}
int main(int argc, char* argv[])
{
/*****************************************************
1. 正数:
正数的原码、反码、补码都相同。
2. 负数:
原码:负数的绝对值,并且最高位为1。
反码:原码的符号位不变,其他位按位取反。
补码:在反码的基础上+1。
3. 移码:
无论是正/负数,都是在补码的基础上,符号位取反。
******************************************************/
int true_code1 = true_code(4);
int true_code2 = true_code(-4);
int complemental_code1 = complemental_code(4);
int complemental_code2 = complemental_code(-4);
int ones_complement1 = ones_complement_code(4);
int ones_complement2 = ones_complement_code(-4);
int frame_shift1 = frame_shift(4);
int frame_shift2 = frame_shift(-4);
printf("true_code1=%d\r\n", true_code1);
printf("true_code2=%d\r\n", true_code2);
printf("complemental_code1=%d\r\n", complemental_code1);
printf("complemental_code2=%d\r\n", complemental_code2);
printf("ones_complement1=%d\r\n", ones_complement1);
printf("ones_complement2=%d\r\n", ones_complement2);
printf("frame_shift1=%d\r\n", frame_shift1);
printf("frame_shift2=%d\r\n", frame_shift2);
printf("\r\n");
showvaluebin(32, 4);
printf("\r\n");
showvaluebin(32, -4);
printf("\r\n");
return 0;
}
结果如下:
true_code1=4
true_code2=-2147483644
complemental_code1=4
complemental_code2=-2147483644
ones_complement1=4
ones_complement2=-2147483645
frame_shift1=-2147483644
frame_shift2=2147483644
00000000000000000000000000000100
11111111111111111111111111111100