姿势体系结构的详细解释 -- C
我基本上总结出以下4部分:
1、问题的足迹大小。
2、字节对齐问题。
3、特别保留位0。
4、这种结构被存储在存储器中的位置。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //基本概念
/*
struct _M
{
(1) 类型 參数名 : 占位大小。
(2) 类型 : 占位大小;
} (1)
类型 -- int,unsigned(32位),short,char。 參数名 -- 同个结构体里面不能重名參数。 占位大小 -- 不能大于类型最最大位数。 (2) 一般用于寄存器中保留位
*/ //占位大小问题:
/*
err -- int类型是32位。34大于32位,所以编译出错。
struct _A
{
int x1:34;
}; err -- char类型是8位,9大于8位,所以编译出错。
struct _A1
{
char x1:9;
};
*/ //字节对齐
/*
偏移量 -- 类型和占位大小影响(与结构体字节对齐差点儿相同意思)。 */
struct B
{
char x1:1;//1位。字节对齐占1字节,8位。
char x2:8;
char x3:1;
char x4:8;
char x5:1;
}; struct C
{
char x1:4;
char :1;
char x2:3;
}; struct _C
{
char x1:4;
char :8;
char x2:3;
}; //特殊保留位0
struct C1
{
char x1:4;
char :0;//这个0占了4个字节
char x2:3;
}; struct _C1
{
char x1:4;
char :4;//这个0占了4个字节
char x2:3;
}; //内存中存放顺序
struct D
{
char x1:1;//最低位
char x2:1;
char x3:1;
char x4:1;
char x5:1;
char x6:1;
char x7:1;
char x8:1;//最高位
}; int
main()
{
//字节对齐
B b;
printf("sizeof(b) = %d\n", sizeof(b)); C c;
printf("sizeof(c) = %d\n", sizeof(c)); _C _c;
printf("sizeof(_c) = %d\n", sizeof(_c)); //特殊保留位0
C1 c1;
printf("sizeof(c1) = %d\n", sizeof(c1));
memset(&c1, 0, sizeof(c1) );
c1.x1 = 0xf;
c1.x2 = 0x7;
printf("c1 = 0x%x\n", c1); _C1 _c1;
printf("sizeof(_c1) = %d\n", sizeof(_c1));
memset(&_c1, 0, sizeof(_c1) );
_c1.x1 = 0xf;
_c1.x2 = 0x7;
printf("_c1 = 0x%x\n", _c1); //内存中存放顺序
D d;
memset(&d, 0, sizeof(d) );
printf("d = 0x%08x\n", d);
d.x1 = 1;
printf("d = 0x%08x\n", d); } /*
[root@localhost test_class]# gcc quote.cpp ;./a.out
sizeof(b) = 5
sizeof(c) = 1
sizeof(c1) = 2
c1 = 0x70f
sizeof(c2) = 3
d = 0x00000000
d = 0x00000001
[root@localhost test_class]# gcc quote.cpp ;./a.out
sizeof(b) = 5
sizeof(c) = 1
sizeof(_c) = 3
sizeof(c1) = 2
c1 = 0x70f
sizeof(_c1) = 2
_c1 = 0x70f
d = 0x00000700
d = 0x00000701 */
以下是别人的博客:
在使用结构体位制的时候有两点要特别注意:
1.//位段成员的类型仅可以为unsigned或者int
2.
unsigned b:4;
unsigned :0; //定义长度为0的位段时不能指定名字,否则编译只是
unsigned d:1; //定义了0字段后,紧接着的下一个成员从下一个存储单元開始存放; //此样例中,d前面那个存储单元中的余下的27位中被0填充了 /*
DATE : 2010.6.24
关于C中的位端igned或者int
*/
#include <stdio.h> typedef struct _A
{
unsigned int a:4;//位段成员的类型仅可以为unsigned或者int
unsigned b:4;
unsigned c:2;
unsigned d:6;
unsigned E:1;
unsigned D:2;
unsigned T:3;
unsigned A:9;
unsigned h:4; //前面已经为31,故4+31>32已超过一个存储单元,所以4在一个新的存储单元存放
unsigned y:29;//由于前面的4在一个新的存储单元的开头存放,且29+4>32, 故在还有一个新的存储单元存放
}A; //所以最后求出的A的大小是4 + 4 + 4 =12 /*对上面的详细解释: 一个位段必须存储在同一个存储单元中,不能跨两个单元.假设某存储单元空间中不能容纳
下一个位段,则改空间不用,而从下一个存储单元起存放该位段. 结构体A中的h和y就是这样的情况.
在gcc环境下,測试后,一个存储单元为4个字节.
*/ typedef struct _S
{
unsigned a:4;
unsigned b:4;
unsigned c:22;
unsigned q:1;
unsigned h:1;
//unsigned i:33; // 错误:‘i’ 的宽度超过它自身的类型
//unsigned i:1;当多出此行时,该结构体大小由4变为8,由于此行之前正好为32位
} S; typedef struct _T
{ //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小
unsigned a:2;
unsigned b:2;
unsigned j:1;
unsigned : 1;//可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用
} T; typedef struct _V
{
unsigned a:1;
unsigned b:4;
unsigned :0; //定义长度为0的位段时不能指定名字,否则编译只是
unsigned d:1; //定义了0字段后,紧接着的下一个成员从下一个存储单元開始存放;
}V; //此样例中,d前面那个存储单元中的余下的27位中被0填充了 int main()
{
A a; S s; T t; V v;
printf("sizeof(a)=%d\n", sizeof(a));
printf("sizeof(s)=%u\nsizeof(t)=%u\n", sizeof(s), sizeof(t));
printf("sizeof(v)=%d\n", sizeof(v));
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
姿势体系结构的详细解释 -- C的更多相关文章
- Linux下函数调用堆栈帧的详细解释【转】
转自:http://blog.chinaunix.net/uid-30339363-id-5116170.html 原文地址:Linux下函数调用堆栈帧的详细解释 作者:cssjtuer http:/ ...
- cmd 环境变量设置方法详细解释
cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...
- .htaccess语法之RewriteCond与RewriteRule指令格式详细解释
htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签: htaccess it 分类: 网络 上文htacc ...
- cookie的详细解释
突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...
- tar命令的详细解释
tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报 分类: linux/unix ...
- Linux学习笔记15——GDB 命令详细解释【转】
GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
随机推荐
- zabbix监控nginx连接状态(转)
zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数) ...
- linux crontab定时执行shell脚本
linux下使用crontab命令被用来提交和管理用户的需要周期性执行的任务,示例如下:crontab -e 编辑周期任务30 21 * * * /etc/init.d/smb restart 每晚的 ...
- JDBC数据库编程常用接口(转)
JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...
- IntelliJ IDEA Groovy(转)
更新环境变量: source /etc/profile 验证是否成功: # groovy -version Groovy Version: 2.3.6 JVM: 1.7.0_67 Vendor: Or ...
- Linux系统部署规范v1.0
Linux系统部署规范v1.0 目的: 1.尽可能减少线上操作: 2.尽可能实现自动化部署: 3.尽可能减少安装服务和启动的服务: 4.尽可能使用安全协议提供服务: 5.尽可能让业务系统单一: 6.尽 ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- DRY
DRY(Don't Repeat Yourself )原则 凡是写过一些代码的程序猿都能够意识到应该避免重复的代码和逻辑.我们通过提取方法,提取抽象类等等措施来达到这一目的.我们总能时不时的听到类 ...
- ubuntu 系统设置bugzilla制
随着时间的推移.在大脑中形成的记忆总会慢慢的淡去.人的记忆力就是这样.所以最好的办法就是形成博客去记录下来,一方面给自己以后回想用.一方面也算是自己的一个积累.所以一旦选择了一个行业,最好不要轻 易转 ...
- 大爱jQuery,10美女模特有用jQuery/CSS3插入(集成点免费下载)
整合下载地址:http://download.csdn.net/detail/yangwei19680827/7343001 jQuery真的是一款非常犀利的Javascript框架,利用jQuery ...
- Windows下一个JSP环境配置
一.首先安装JDK 门户: http://write.blog.csdn.net/postedit/39999433 二.安装Myeclipse 事实上也能够安装eclipse然后再安装Myeclip ...