C语言笔记

您所在的位置:网站首页 存储器地址寄存器mar的位数至少是 C语言笔记

C语言笔记

#C语言笔记| 来源: 网络整理| 查看: 265

C语言笔记【2】 知识点: 1、结构体占字节数 2、小端地址与大段地址 3、 边界对齐方式存储

【2012年计算机联考真题】 某计算机存储器按字节编址,采用小端方式存放数据,假定编译器规定int和short型长度分别为32位和16位,并且数据按边界对齐存储,其C语言程序段如下:

struct{ int a; char b; short c; }record; record.a=273;

若record变量的首地址为0xC008,则地址0xC008中的内容及record.c的地址分别为( )

A . 0x00 0xC00D

B . 0x00 0xC00E

C . 0x11 0xC00D

D . 0x11 0xC00E

【答案】 D

分析: 【1】存储器按字节编制。 record------结构体变量-----占所有字节数之和。

类型字节数int a4char b1short c2record4+2+1=7

本来record应该是占得7个字节,如果这一题没有其他限制的话。 但是这一题出现了数据按边界对齐存储的条件,事实上,record占得是8个字节(需要后续分析才知道)。

结构体变量字节数record8

【2】小端方式和大端方式 1、大端方式:数据高字节—>内存的低地址;数据低字节---->内存的高地址。 1、小端方式:数据高字节—>内存的高地址;数据低字节---->内存的低地址。 如果广义成一个二进制对象,大端法对应的就是从头到尾存储,小端法就是从尾到头。 在这里插入图片描述 【3】数据按边界对齐存储 通俗的来说,变量的起始地址为其大小的整数倍,比如short占2个字节,起始地址从偶数地址开始。 比较官方的定义为:即对于存放某长度为 m 字节的数据,存放首地址需为m 字节的整数倍,同时,结构体整体的大小是最大成员长度的整数倍。 在这里插入图片描述

如上图所示,在采用边界对齐的情况下,当处理器需要访问a_变量和b_变量时都只需进行一次存取(图中花括号表示一次存取操作)。若不采用边界对齐,a_变量只要一次处理器操作,而b_变量却至少要进行两次操作。对于b_,处理器还得调用更多指令将其合成一个完整的 4 字节,这样无疑大大降低了程序效率。 【解题步骤】 1、273=0x111=0x 00 00 01 11(化成32位) 2、内存中的存储

地址数据(0x)0xC00811 (record.a)0XC00901 (record.a)0XC00A00 (record.a)0XC00B00 (record.a)0XC00Crecord.b0XC00D-----0XC00Erecord.c0XC00Frecord.c

为什么0XC00D不能直接存放record.c? 这就是前面所说的数据按照边界对齐方式存储的规则,0XC00D,D化成十进制为13,不能整除2字节(record.c),因此后放。

参考: 【1】https://blog.csdn.net/runner_of_nku/article/details/82883245 【2】https://blog.csdn.net/weixin_37641832/article/details/89075718?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase 【3】赵海英教程



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3