• 从“int中提取高八位”开始的学习


    今天有个学弟问了一个问题,怎么提取int中的高八位。

    这个是个非常基础的问题,随便用位运算瞎搞几下就出来了。

    看到这个问题的时候,也不知道我当初想了些啥,想了个骚操作,用memcpy把int放到字符串里。。承认吧,你就是个毒瘤。ヾ(・ω・`。) 

    实现方法如下

    #include <cstdio>
    #include <cstring>
    int main(){
        int a = 0xaabbccff;
        char ch[4];
        memcpy(ch, &a, 4); 
        for(int i = 0; i < 4; i++){
            printf("ch[%d]=%#x ", i, 0xff & ch[i]);
            /* %x会强制转换ch[i]为int类型,如果第一个字节为1会前补1,所以只取低八位即可 */
            /* OUTPUT : 
           ch[0]=0xff ch[1]=0xcc ch[2]=0xbb ch[3]=0xaa 
         */
        }
        return 0;
    }  

    但是我跟学弟说的取高八位直接取ch[0],从输出结果看,我的答案应该是错的,一下子没有想通为什么。

    后面才知道是字节序。仿佛触及到了我的知识盲区了(你本来就是个什么都不懂的菜鸡),就去查了一下。

    其实总共就下面几句话:

    计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

    大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。

    小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

    计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。

    举个例子

    #include <cstdio>
    #include <cstring>
    int main(){
        int a = 0xaabbccdd;
        char c;
        c = a;
        printf("%#x
    ", 0xff&c);
        /* OUTPUT:
           0xdd
        */    
    }  

    但是有些cpu并不是严格按照小端字节序进行处理数据的,所以,我这个毒瘤方法虽然可以提取出每个字节的值,但是在不同机器上取值的下标可能不一样,所以并不能适用。

  • 相关阅读:
    vue的class绑定
    less里面calc() 语法
    问题
    Spring Boot面试题
    Redis面试题
    nginx面试题
    rabbitMQ面试题
    Linux+Git命令
    docker
    JAVA常用单词
  • 原文地址:https://www.cnblogs.com/HDMaxfun/p/11408392.html
Copyright © 2020-2023  润新知