~欢迎你!第 AmazingCounters.com 位造访者

从“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\n", 0xff&c);
    /* OUTPUT:
       0xdd
    */    
}  

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

posted @ 2019-08-25 16:41  ~HDMaxfun  阅读(1428)  评论(0编辑  收藏  举报