提题来见(1)
来源:互联网 发布:博雅软件2017 编辑:程序博客网 时间:2024/04/30 03:36
在x86下,有下列程序
#include <stdio.h>#include <windows.h>int main(){union {short k;char i[2];}*s,a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\n",a.k);system("pause");return 0;}
输出的结果是()
A.3839 B.3938 C.380039 D.不确定
这道题是在考我们对大小端字节序的知识。
首先我们来认识一下字节序,顾名思义字节的顺序,也就是大于一个字节类型的数据在内存中的存放顺序。
那么字节序分为两类:Big-Endian和Little-Endian。
引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
比如,以太网头部中2字节的“以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太
网帧类型来说,在网络传输时,发送的顺序是0x08,0x06。在内存中的映像如下图所示:---------------------------------------------------------------------------------------
我们来看看C程序中内存空间布局情况:
以上图为例 如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布的?
现在我们对于高低地址有了认识,那么高低字节又是怎么回事呢?
假如我们把上面的buf[4](正好四个字节)合起来看成一个32位无符号整型0x12345678,这样的话,高位是0x12还是 0x78 ? 低位呢? 我们来回想一下我们接触最多的十进制数,靠左边的是高位,靠右边的低位。 当然啦,其他进制也是这样的。我们来回到上面的问题,0x12345678,高位到低位的字节依次是0x12 0x34 0x56 0x78.
我们再来回顾一下Big-Endian和Little-Endian的定义 ,并用图示来说明这两种字节序:
就用刚才的unsigned int value = 0x12345678为例,用unsignedchar buf[4]来表示value:
在现有的平台上Inter的x86采用的是Little-Endian,Sun的SPARC采用的是Big-Endian。
所以选A。
- 提题来见(1)
- 17-1-(1)
- 17-1-(1)
- 17-1-(1)
- 类1(1)
- 1属地(1)
- Java(1-1)
- (1)
- ((void*)-1)
- 求值1-(1/2)+...(-1)^n*(1/m)
- 深入Struts1.1(1)
- Textpro5.1应用(1)
- jbpm5.1介绍(1)
- 1、数据预处理(1)
- jbpm5.1介绍(1)
- jboss eap6.1(1)
- 1-HEVC概览(1)
- thinkphp3.1入门(1)
- 百度地图开发出现的No implementation found for问题
- Android应用的信鸽推送集成
- DevExpress GridControl 跨列横向合并单元格两个官方例子
- Map<String,Object> ,List 顺序排列
- [LeetCode]Contains Duplicate III
- 提题来见(1)
- mysql中的共享锁与排他锁
- Linux关于bash的二三事(2)
- 【Get深一度】ASCII表ASCII表ASCII表ASCII表
- Stack
- SQL with(nolock)详解
- 网格生产的常用算法
- 函数特性
- PL/SQL 标签与GOTO语句