PX-25-原码反码补码

1.原码补码反码

 

 2.原码

0000 0111  +7
1000 0111  -7  原码  第一位0代表正数,1代表负数,第一位符号位    87

 

3.反码

0000 0111  +7反码正数与原码一样
1111 1000  -7       F8

 

4.补码

0000 0111  +7 反码正数与原码一样
1111 1000  -7  对反码加一,  F8

 

5.计算补码

   int num = -1;
    // 0000 0000  0000 0000 0000 0000 0000 0001 +1原码
    // 1000 0000  0000 0000 0000 0000 0000 0001     -1原码
    // 1111 1111  1111 1111 1111 1111 1111 1110 -1 反码
    // 1111 1111  1111 1111 1111 1111 1111 1111 -1 补码

计算方法:

原码,反码,补码,正数都是一样的
负数,原码取反(不包含符号位)+1=补码

 

-----
无符号没有符号位,统一处理为数据
有符号,第一位是符号位

void main3()
{
    int num = -1;
    // 0000 0000  0000 0000 0000 0000 0000 0001 +1原码
    // 1000 0000  0000 0000 0000 0000 0000 0001     -1原码
    // 1111 1111  1111 1111 1111 1111 1111 1110 -1 反码
    // 1111 1111  1111 1111 1111 1111 1111 1111 -1 补码

    printf("%d", num);  //    -1

    printf("\n%u", num);  //  4294967295
    getchar();
}

 

 

6.原码补码的比较

为什么用补码?时钟 一一映射三点到六点 前拨3小时 倒着拨9小时都是一样的

0000 0111  +7   原码的加法
1000 0001  -1
 000 0110  +6
取绝对值,去掉符号位   比较大小,减法  ,加上符号位
1000 1001 -9
0000 0111 +7
1000 0010 -2

取绝对值 , 去掉符号位  ,9-7,减法 

1000 0001 -1原码
1111 1110- 1反码
1111 1111 -1补码
 0000 0111 +7
 1111 1111 -1
 0000 0110  +6
1000 1001 -9原码
1111 0110 -9反码
1111 0111 -9补码

 0000 0111 +7
 1111 0111 -9
      111
 1111 1110  补码-2
 

 1000 0001  反码
 1000 0010 原码 -2

 

 

 

7.int 的最大值

 

1111 1111    1111 1111    1111 1111   1111 1111  4294967295  无符号   2^32-1
0000 0000    0000 0000    0000  0000  0000 0000 0


0111 1111    1111 1111    1111 1111   1111 1111   有符号的最大值 2^31

1111 1111    1111 1111    1111 1111   1111 1111   有符号的最小值 - (2^31+1)

 

 

 

 

 

 

 

 

代码:

#include<stdio.h>
#include<limits.h>

void main1()
{
    unsigned int num = -1;     //1111111111111111111111111111
    printf("%u", num);

    for (int i = 0; i < num; i++)  //循环10次
    {
        printf("你好天朝");
    }
}

void main2()
{
    char ch = -17;  //计算机都是补码存储,手机,电脑,服务器补码
    //0001 0001   +17原码
    //1001 0001    -17原码
    //1110 1110       -17反码
    //1110 1111        -17 补码         EF

    printf("%p", &ch);
    getchar();
}


void main3()
{
    int num = -1;
    // 0000 0000  0000 0000 0000 0000 0000 0001 +1原码
    // 1000 0000  0000 0000 0000 0000 0000 0001     -1原码
    // 1111 1111  1111 1111 1111 1111 1111 1110 -1 反码
    // 1111 1111  1111 1111 1111 1111 1111 1111 -1 补码

    printf("%d", num);

    printf("\n%u", num);
    getchar();
}

void main4()
{

    printf("%d,%d", INT_MAX, INT_MIN);
    getchar();
}


void main()
{
    int num = -1;
    unsigned int data = 4294967295u;//无符号数据        111111全部都是数据
    int num1 = 4294967295u;          //32个1
    unsigned int data1 = -1;

    printf("%d", num);       // -1
    printf("\n%u", num);   //4294967295
    printf("\n%d", num1);       //  -1
    printf("\n%u", num1);  //  4294967295
    printf("\n%u", data);  //4294967295
    printf("\n%d", data);    //-1
    printf("\n%u", data1);      //4294967295
    printf("\n%d", data1);      //-1

    printf("\n%f", 1);       //printf,不管三七二十一,抓取二进制数据就解析
    getchar();
}

void  main7()
{
    //printf("%d,%d", INT_MAX, INT_MIN);
    //printf("\n%d,%d", INT_MAX+1, INT_MIN); //%d显示范围     INT_MAX, INT_MIN  补码
    //printf("\n%d,%d", INT_MAX , INT_MIN-1); 

    printf("%u,%u", UINT_MAX, 0);
    printf("\n%u,%u", UINT_MAX+1, 0);//%u显示范围 0-UINTMAX
    printf("\n%u,%u", UINT_MAX + 1, -1);  //溢出 , 补码

    getchar();
}

 

posted @ 2016-12-12 19:25  silvercell  阅读(9939)  评论(0)    收藏  举报