从网上看到这样一段c代码,让我发觉我的C基本功还是不行啊~~

  1. typedef struct xp {
  2. int a:2;
  3. int b:2;
  4. unsigned int c:1;
  5. } xp;

不知道大家对int声明中的这个":"熟悉吗?不过,我刚看到的时候有点懵。在网上查了些资料,才明白这是一种将int按位分配的方法。

比如:int a:2;表示a为占2位的整数。

通常的int为4字节,即占用32位的整数。

同时 按位分配的int,也分有符号和无符号两种,如:

  1. typedef xp
  2. {
  3. int a:2;
  4. unsigned int b:2;
  5. }MyXp;
  6. MyXp x;
  7. x.a = 3;
  8. x.b = 3;

这样,输出的x.a为-1,x.b为3。

同时,大家看到,这种分配方法是定义在struct中的。如果你在代码中直接定义:int a:2;编译时会导致错误,无法识别“:”。

这是因为int是内建类型,它不能被改变内存分配的方式。所以单独的int,不能直接被声明为只占2位。

而在struct中,对整个struct的内存分配,还是遵循c的内存分配方式,但在其中每一个内存位的表示含义,则可以由我们自己说明。如下:

  1. printf("%d/n", sizeof(x));
  2. printf("%d/n",sizeof(x.a));

第一句能返回4,表示MyXp是占用4个字节的,其实其中的多个int,对系统来说只是将一个int截成了不同的段来使用,整个内存分配还是按照一个int来。当然,如果总位数超过了32位,那struct大小会以4字节为单位递增,即struct的大小为4字节、8字节、12字节等。

而同时,第二句printf编译错误,是因为系统识别不出x.a的类型,因为他不是普通的int类型,系统无法识别x.a占用了2位。

从内存上看,a和b占用了x的32位中的低4位,高位没有分配的会以0值填充。

有兴趣的可以看一下运行时的内存分配。struct中的a、b是公用一个int的内存段,如果再添加新的变量,他们也是使用同一个int内存段,直到一个int段不够,则直接再开一个int段供使用。同时,如果反编译这段代码,也能发现,对a、b的赋值和访问和一般的int不同,是通过位操作来进行的。

注意,共享内存段的只能是在struct中连续声明的按位分配的int变量,如下声明:

  1. typedef struct xp {
  2. int a:3;
  3. int b:2;
  4. int k;
  5. unsigned int c:2;
  6. } xp;

则xp会占用3个int的内存段,因为a、b共享一个int的4字节,k自己单独占用一个int,c则需要开一个新的int内存段使用。而如果将k和c的声明互换,则xp只需要占用2个int的内存段。

最新文章

  1. Oracle sqlplus设置显示格式命令详解
  2. Apache Shiro 使用手册(三)Shiro 授权
  3. Eclipse中导入外部jar包
  4. s3c6410_时钟初始化
  5. C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
  6. iOS 的一点理解(一) 代理delegate
  7. u-boot烧写Linux及系统整个启动过程
  8. Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
  9. 让乌龟在提交cocos2d-x版本时自动去掉不需要的东东
  10. HTTP协议缓存策略深入详解之ETAG妙用
  11. IO的构造方法
  12. redis常见使用场景下PHP实现
  13. du---查看文件夹大小-并按大小进行排序
  14. HFun.快速开发平台(二)=》自定义列表实例
  15. Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException
  16. ASP.NET CORE 2.0 Uses SignalR Technology
  17. 步步为营-55-js练习
  18. [Leetcode 881]船救人 Boats to Save People 贪心
  19. Typescript学习总结之接口
  20. C# 动态创建SQL数据库(一)

热门文章

  1. (39)zabbix snmp自定义OID nginx监控实例
  2. 一篇关于BEM命名规范
  3. PAT Basic 1070
  4. Python第三方库之openpyxl(6)
  5. javascript异常cannot read property xx of null 的错误
  6. 在table第一行前插入一行
  7. JAVA如何解压缩ZIP文档
  8. JavaWeb基础(HTML)
  9. BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交
  10. BZOJ 3450 Tyvj1952 Easy ——期望DP