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型,但它在内存中却占用了四个字节,只不过是后面三个字节是空的,没被使用而已 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值