面试题集锦

来源:互联网 发布:人工智能瓶颈问题 编辑:程序博客网 时间:2024/06/11 21:25

大端小端

#include <stdio.h>int main(int argc, char *argv[]){    int arr[] = {0x61626364, 0x65006667};    printf("%s\n", (char *)arr);    return 0;}

如上所示,这段代码输出什么?如果有错误,请解释。
从C的角度看,这段代码把一个整形数组按照字符串的形式输出。C里面的字符串,其实就是一个字节序列,以'\0'结束。那么,核心问题就在于整数在字节层面是怎么表示的,也就是所谓的字节序。
什么是字节序?每个学计算机的都知道32位系统下,一个整型是4个字节。但是,这4个字节到底是怎么排列的呢?比如一个十六进制数0x01020304,有4个字节0x01,0x02,0x03和0x04,这四个字节在内存中可以有4*3*2*1=24种排列方式!到底是哪种?当然,世界没有那么坑,计算机系统只采用两种排列方式:一种是0x04,0x03,0x02,0x01,即把数据的低字节存在内存的低地址(靠前),这就是所谓的小端系统;另外一种刚好相反,把数据的高字节存在内存的低地址,这就是所谓的大端系统。
回到上面的代码片段,假设系统是32位小端系统(大部分机器都是),看看C整型数值在内存中是怎么布局的:
       +––––––+ <--- arrlow    | 0x64 | d       +––––––+       | 0x63 | c       +––––––+       | 0x62 | b       +––––––+       | 0x61 | a       +––––––+       | 0x67 | g       +––––––+       | 0x66 | f       +––––––+ <--- end       | 0x00 |       +––––––+high   | 0x65 | e       +––––––+

这个整型数组包含两个元素,总共是八个字节,从上往下,地址增高。将数组中两个整型按照小端的方式填入这八个字节,如上图。现在arr指向数组的开始地址,printf从该地址开始,逐一输出每个字符(字节),直到遇到'\0',也就是0x00,end所指向的地方。那么从arr到end之间6个字节存的到底是什么字符呢?这个可以查ASCII表得知,0x61是小写字母a,以此类推。现在答案很明显了,程序输出:dcbagf。不知你猜中没?
0 0
原创粉丝点击