zoukankan      html  css  js  c++  java
  • C 数据存储原码,补码,反码计算

    0x01整形

    无符号的整数 原码,补码,反码相同

    有符号的整数 

    正数:原码,补码,反码相同

    负数:原码,补码,反码不相同,要进行计算

    加法计算就是补码计算 

        int a = 20;
        //0000 0000 0000 0000 0000 0000 0001 0100 -原码
        //0000 0000 0000 0000 0000 0000 0001 0100 -反码
        //0000 0000 0000 0000 0000 0000 0001 0100 -补码
        //0x00 00 00 14
        int b = -10;
        //1000 0000 0000 0000 0000 0000 0000 1010 -原码
        //1111 1111 1111 1111 1111 1111 1111 0101 -反码
        //1111 1111 1111 1111 1111 1111 1111 0110 -补码
        //0x ff ff ff f6

    低位高存

     0x02 字符

        char a1 = -1;
        //11111111
        signed char  b2 = -1;
        //11111111
        unsigned char b3 = -1;
        //00000000 00000000 00000000 11111111
        printf("%d,%d,%d", a1, b2, b3);
        //-1 -1 255

    需要记住的是-1 的补码就是1111....

    char 高位为1转成int就是高位补24个1

    signed char 和char 一样

    unsigned char 标识是0补24个0  转成int就是255

    在看这个例子

        char a = -128;
        //1000 0000
        printf("%u",a);

    输出4294967168  为什么呢 实际上 -128 就是 127+1

    char a=127+1   由于负号a在转无符号int

    1000 0000 0000 0000 0000 0000 1000 0000 -原码 

    1111 1111 1111 1111 1111 1111 0111 1111-反码

    1111 1111 1111 1111 1111 1111 1000 0000 -补码 

    转成无符号整形就是429.。。

    signed char 的取值范围就是 -128~127

    unsigned char 的取值范围就是 0~255

    看一下负数计算

        int i = -20;
        unsigned int j = 10;
        printf("%d", i + j);
        //i的值
        //10000000 00000000 00000000 00010100 -原码
        //11111111 11111111 11111111 11101011 -反码
        //11111111 11111111 11111111 1110 1100 -补码
        //j的值
        //00000000 00000000 00000000 0000 1010 补码
        //相加
        //11111111 11111111 11111111 1111 0110 补码
        //11111111 11111111 11111111 1111 0101 反码
        //10000000 00000000 00000000 0000 1010 原码
        //计算 就是 -10

    0x03浮点

    float x = 58.25f;

    他是怎么在内存了存储的呢

    先把

    58转换为二进制:

    58/2=29 余0

    29/2=14 余1

    14/2=7  余0

    7/2=3   余1

    3/2=1   余1

    1/2=0   余1

    从下往上取余数111010

    58.25的二进制就是

    111010 

    小数部分

    0.25*2=0.5 取个位0

    0.5*2=1 取各位1

    连接在一起就是

    111010.01 用科学计数法

    1.1101001 *10^5

    他是有一个公式

    (-1)^0*1.1101001 *10^5

    (-1)^s *M   *10^e

    s -0

    m- 1.1101001

    e-5

    32位的浮点数,最高位符号s  接着是指数E,剩下的是23位有效数字M

    e的起始值就是127  在加+5 132  我们知道128是10000000 就是128+4

    尝试拼接

    0 1000 0100   1101 0010 0000 0000 0000 000

    s      e             m

    划分一下

    0100 0010 0110 1001 0000 0000 0000 0000

    4         2        6      9     0       0          0     0

    00 00 69 42 

    看一下

    从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
  • 相关阅读:
    Elasticsearch 结构化搜索
    KMP 算法
    ElasticSearch 配置
    C++ 入门
    Spark 基础操作
    HBase 与 MapReduce 集成
    iOS面试相关
    iOS开发值得学习的Demo
    Mac系统安装MyEclipse
    linux安装tomcat
  • 原文地址:https://www.cnblogs.com/feizianquan/p/14671033.html
Copyright © 2011-2022 走看看