当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C语言怎么求得一个32位数的原码、补码、反码、和移码?

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

2018年10月03日  | 移动技术网IT编程  | 我要评论

成都市中考成绩查询,巧虎动画片全集2013,溪木工坊

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

源代码如下:

#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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网