大小端的面试题

西艾:X86结构下,下面代码输出结果是什么?

代码:

   1:      char str[20]="Good night";
   2:      int* p=(int*)str;
   3:      p[0]=0x61626364;
   4:      p[1]=0x31323334;
   5:      p[2]=0x41424344;
   6:      cout<<str<<endl;

解题:考察知识点:

(1)int的内存大小:32bit=4byte;char的内存大小:8bit=1byte;

(2)常用字符的ASCII 码,’a’:97;’A’=65;’0’=48;

(3)十六进制转,0x61=97;

(4)大小端模式:

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

       而X86结构为小端模式,所以

            p[0]=0x61626364;//97,98,99,100对应a,b,c,d,小端存在字符串str则为dcba 
            p[1]=0x31323334;//同理4321 
            p[2]=0x41424344;//同理DCBA

 

     代码输出:dcba4321DCBA


  在C语言中除了8位的char型之外,还有16 的short型,32 的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

大端模式:

字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式

与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

例如,16位宽的数0x1234在 小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

存放内容

0x34

0x12

而在大端模式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

存放内容

0x12

0x34

32位宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

0x4000

0x4001

0x4002

0x4003

存放内容

0x78

0x56

0x34

0x12

而在端模式CPU内存中的存放方式则为:

内存地址

0x4000

0x4001

0x4002

0x4003

存放内容

0x12

0x34

0x56

0x78


       我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

Note:采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。
(我的理解:小端模式在低字节就放一个低位)

下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
  1. int checkCPU(void)  
  2. {  
  3.     union  
  4.     {  
  5.         int a;  
  6.         char b;  
  7.     }c;  
  8.     c.a = 1;  
  9.     return (c.b == 1);  
  10. }

// 内存地址 是 由低  向 高 偏移, 0x1234 则是 低地址在后,高地址 在前, 

大端 高地址 放在 低位 , 所有0x12 放在开始 ,0x34在后面  ,反之 小端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiny丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值