欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言怎么求得一个32位数的原码、补码、反码、和移码?

程序员文章站 2024-01-21 14:13:58
由于浮点数还需要考虑浮点数的存储方式,所以目前暂时提供正数的补码、反码、移码 源代码如下: #include #include #i...

由于浮点数还需要考虑浮点数的存储方式,所以目前暂时提供正数的补码、反码、移码

源代码如下:

#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