zoukankan      html  css  js  c++  java
  • 01C基础-01原码反码补码

    原码

    一个数的原码(原始的二进制码)有如下特点:

    l 最高位做为符号位,0表示正,为1表示负

    l 其它数值部分就是数值本身绝对值的二进制数

    l 负数的原码是在其绝对值的基础上,最高位变为1

    下面数值以1字节的大小描述:

    十进制数

    原码

    +15

    0000 1111

    -15

    1000 1111

    +0

    0000 0000

    -0

    1000 0000

    原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。

    反码

    l 对于正数,反码与原码相同

    l 对于负数,符号位不变,其它部分取反(1变0,0变1)

    十进制数

    反码

    +15

    0000 1111

    -15

    1111 0000

    +0

    0000 0000

    -0

    1111 1111

    反码运算也不方便,通常用来作为求补码的中间过渡。

     补码

    在计算机系统中,数值一律用补码来存储。

     

    补码特点:

    l 对于正数,原码、反码、补码相同

    l 对于负数,其补码为它的反码加1

    l 补码符号位不动,其他位求反,最后整个数加1,得到原码

    十进制数

    补码

    +15

    0000 1111

    -15

    1111 0001

    +0

    0000 0000

    -0

    0000 0000

    %d 将数据按照十进制输出
    %o将数据按照八进制输出
    %x将数据按照十六进制小写输出
    %X将数据按照十六进制大写输出
    #include <stdio.h>
    
    int main(void)
    {
        //十进制数10
        int a=10;
        printf("%X
    ",a);
        //八进制
        int b=010;
        printf("%X
    ",b);
        //十六进制
        int c=0X10;
        printf("%X
    ",c);
        return 0;
    
    }
    有符号的整型数据可以分为两部分一部分是符号位、一部分是数字位
    无符号数据类型只包含数字位部分
    signed int a= 1986(有符号标识 signed可以不用写) 
    二进制:11111000010
     
    1986原码:0000 0000 0000 0000 0000 0111 1100 0010
    -1986原码:1000 0000 0000 0000 0000 0111 1100 0010
     
    1986反码: 0000 0000 0000 0000 0000 0111 1100 0010
    -1986反码:1111 1111 1111 1111 1111 1000 0011 1101
     
    1986补码: 0000 0000 0000 0000 0000 0111 1100 0010
    -1986反码:1111 1111 1111 1111 1111 1000 0011 1110
                     1 0000 0000 0000 0000 0000 0000 0000 0000
    溢出:在数据进行操作的时候会导致超出数据类型大小,会向前位进1,多于原始数据类型大小,会被系统自动舍弃 保留从后面开始数据类型大小的位数  
     
      10+20
    0000 1010
    0001 0100
    0001 1110
    -10+-20
    原码:1000 1010
    反码:1111 0101
    补码:1111 0110
     
    原码:1001 0100
    反码:1110 1011
    补码:1110 1100
         1111 0110
         1110 1100
    补码:1110  0010
    反码:1110 0001
    原码:1001 1110 16+8+4+2=-30
     
    #include <stdio.h>
    
    int main()
    {
    
        int a=10;
        //sizeof()求出数据类型在内存中占字节(Byte)大小
        int len1 = sizeof(a);
        //单精度浮点型
        float b = 3.14;
        //字符型
        char c = 'A';
        //双精度浮点型
        double d = 5.12;
        //短整形
        short e = 10;
        //长整型
        long f = 10;
        //长长整形
        long long g=10;
        int len2 = sizeof(b);
        int len3 = sizeof(c);
        int len4 = sizeof(d);
        int len5 = sizeof(e);
        int len6 = sizeof(f);
        int len7 = sizeof(g);
        printf("%d
    ",a);
        printf("int =%d
    ",len1);
        printf("float =%d
    ",len2);
        printf("char = %d
    ",len3);
        printf("double = %d
    ",len4);
        printf("short = %d
    ",len5);
        printf("long = %d
    ",len6);
        printf("long long = %d
    ",len7);
        return 0;
    }
  • 相关阅读:
    每天两题02
    每天两题01
    简单看看原码、补码和反码
    简单看看java之枚举
    随意看看AtomicInteger类和CAS
    js原型链
    简单看看jdk7源码之Object和String
    简单学习js
    element的表单校验自动定位到该位置
    for循环使用element的折叠面板遇到的问题-3
  • 原文地址:https://www.cnblogs.com/wanglinjie/p/11080145.html
Copyright © 2011-2022 走看看