08 2011 档案

摘要:我们的讨论从一道经典的题目开始:Intel和微软同时出现的面试题#pragma pack(8)struct s1{char a;longb;};struct s2{char c;s1 d;long long e;};#pragma pack()问1.sizeof(s2) = ?2.s2的c后面空了几个字节接着是d?经上机测试,sizeof(s2)=24。s2的C后面空了7个字节。这里涉及到一个我们平时可能会忽视的问题——内存对齐【Memory alignment】。1.内存对齐定义: 现在使用的计算机中内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际 阅读全文
posted @ 2011-08-22 16:20 llkkyy 阅读(2385) 评论(0) 推荐(0)
摘要:int exchange(int *xp,int y){ int x=*xp;*xp=y;return x;}省略了栈的建立和完成部分的汇编代码如下://xp at %ebp+8,y at %ebp+121 movl 8(%ebp),%edx2 movl (%edx),%eax3 movl 12(%ebp),%ecx4 movl %ecx,(%edx)注:1.int x=*xp;表示将读存储在xp所指位置中的值,并将它存放在名字为x的局部变量中;2.*xp=y;表示将参数y的值写到xp所指向的位置;3.间接引用指针就是将该指针放在一个寄存器中(movl 8(%ebp),%edx... 阅读全文
posted @ 2011-08-19 22:58 llkkyy 阅读(524) 评论(0) 推荐(0)
摘要:C语言中规定,在执行一个运算时,如果它的一个运算数是有符号的而另外一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数。这可以说是一个“妇孺皆知”的规定,但往往由于对它的不重视,引起了一些难以发现的错误。我们来看一个简单的函数,函数功能是实现数组元素的求和,数组长度由length给出。float sum_element(float a[],unsigned length){int i;float result=0;for(i=0;i<=length-1;i++) result+=a[i];return result;}当参数length为0时,函数似乎应该返回0.0。然而 阅读全文
posted @ 2011-08-19 16:16 llkkyy 阅读(445) 评论(0) 推荐(1)
摘要:对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何排列这些字节。在几乎所有的机器中,多字节对象都被存储为连续的字节序列,对象的地址是所使用字节中的最小地址。 小端法:存储器中按照从最低有效字节到最高有效字节的顺序存储对象; 大端法:存储器中按照从最高有效字节到最低有效字节的顺序存储对象; 不同的机器采用不同的规则,我们可以通过程序来了解自己所用机器所采用的规则。#include<stdio.h>typedef unsigned char *byte_pointer; //byte_pointer定义为指向unsigned char类型的对象指针 阅读全文
posted @ 2011-08-17 17:07 llkkyy 阅读(1432) 评论(0) 推荐(0)