C语言中类型转换和字节对齐

这两天浏览了一下《C专家编程》这本经典著作,小有收获,贴出来卖弄一下,呵呵!
首先是关于类型转换:
先看这样一段代码:
struct student
{
int num;
char name[20];
char sex;
int score;
};
void main()
{
long lTemp = -1;

if(lTemp < sizeof(student))
{
printf("-1 is less\n");
}else
{
printf("-1 is larger\n");
}
}
这段代码的输出结果会是什么呢?应该会有人认为输出“-1 is less”,因为sizeof(student)的值至少是正数,比-1大啊。这是比较正常的,我以前也是这样认为。但事实并非如此。执行这段代码,会发现输出“-1 is larger”。这是为什么呢?
其实,原因就出在类型转换上。sizeof()函数的返回值是unsigned long型,而lTemp是long型,两者类型不匹配,于是long自动转为unsigned long型,于是-1就变成了一个很大很大的数FFFFFFFF,自然就输出了“-1 is larger”

其次是字节对齐问题:
请问上文中sizeof(student)的返回值到底是多少呢?也就是说student这个结构体占用了多少内存呢?
如果你不知道字节对齐的话,那你的回答很有可能会是4+20+1+4=29个字节。但实际情况并不是这样。在内存中,处理器是以四个字节为单位进行存取 的,student中的成员变量sex定义为char型,但它在内存中却占用了四个字节,只不过是后面三个字节是空的,没被使用而已

你可能感兴趣的:(编程,C++,c,浏览器,C#)