C语言中类型转换和字节对齐
来源:互联网 发布:淘宝店铺免费代码 编辑:程序博客网 时间:2024/04/30 05:27
这两天浏览了一下《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型,但它在内存中却占用了四个字节,只不过是后面三个字节是空的,没被使用而已
首先是关于类型转换:
先看这样一段代码:
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语言中字节对齐
- 【C语言】字节对齐和边界对齐
- c语言struct中字节对齐
- C语言中结构体字节对齐
- C语言中关于字节对齐
- C语言中字节对齐小结
- c语言中内存字节对齐问题
- C语言中字节对齐问题
- C语言中字节对齐问题
- C语言字节对齐
- C语言字节对齐
- c语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- 固定的左侧移动导航菜单
- 常用排序算法之堆排序与快速排序
- 九九乘法表
- Oracle数据库的物理结构
- 常用排序算法之插入排序与希尔排序
- C语言中类型转换和字节对齐
- 常用排序算法之归并排序
- 通过log4j日志异步化大幅提升系统性能
- 常用排序算法之计数排序,基数排序与桶排序
- 让你帖子不沉的十大方法
- 静态导航菜单
- 关于Linux系统下内存泄漏的检查方法
- 超经典的50个msn签名
- linux各文件夹的作用