C结构体中位域
C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍。程序只是为了了解位域的一些性质,运行时有些编译器可能会报错。
程序代码如下(C++编写),编译器使用的是C-Free,整型变量占4个字节。(由于刚接触,如有错误,还请大家指正。)
#include<iostream>
using namespace std;
struct bit {
;
;
;
};
int main () {
struct bit s;
char *c = (char*)&s;
cout<<sizeof(s)<<endl;
*c = 0x99;
*(c+) = 0x97;
cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;
;
}
程序第5-7行使用到了位域,成员a、b、c虽为整型,但是却明确限制了实际的长度,其中a为3个二进制位,b为2个二进制位,c为3个二进制位。程序的执行结果如下:

第一个表示结构体的长度,由于3个成员实际都没有占用4个字节,所以实际的长度不是12。下面搞清了a、b、c实际的存储关系后就更加清楚了,位域变量在实际存储中是逆序存储的(不知道为什么),则实际的存储情况如图:3个变量一起正好组成一个字节的长度,程序第14行,*c=0x99,则:a = 001B,b = 11B,c = 100B。由于3个数都是整型,默认是带符号的,故a为1,b为-1,c为-4。

如果是这样,那如果3个变量的长度多于8个二进制位呢,将结构体修改为如下(将b的二进制位改为3):
struct bit {
;
;
;
};
这种情况下又该如何存储呢?由于一个字节不足以存放3个变量,那么c是分两个字节存储,还是直接存储在下一个字节的低位呢?运行上述程序,得到结果如下:

c的结果是-2,如果是存储在下一个字节的话,c = 111B,对应的整型数应该为-1,但实际为-2,说明不是这种方式。在看分两个字节存储的方式,在这种方式下c = 110B,正好是-2。为了进一步确认,将程序第14行的赋值操作改为:*c = 0x59;
执行后结果如下:

这说明是分两个字节存储的,存储位置如下:

由于编译器不同,处理的方式也有可能不同。
C结构体中位域的更多相关文章
- C结构体之位域(位段)
C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C ...
- c语言结构体中的冒号的用法
结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省 ...
- C++结构体中sizeof(1)
sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...
- [转]C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...
- C结构体之位域(位段)(转)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- 问题解决——在结构体中使用set保存结构体数据
=====================声明========================== 本文原创,转载请明确的注明出处和作者,并保持文章的完整性(包括本声明部分). 本文链接:http:/ ...
- C语言 结构体中属性的偏移量计算
//计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...
- C语言 结构体中的成员域偏移量
//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
随机推荐
- UIView添加事件
UIView *loadView = [[UIControl alloc]initWithFrame:CGRectMake(0,0,320,480)]; loadView.backgroundColo ...
- Windows下通过脚本快速修改IP地址
Windows下通过脚本快速修改IP地址 如果通过Windows的网络属性修改Ip/网关,真是太麻烦了. 经常要切换ip,所以我写了两个脚本: c:\办公室.bat netsh interface i ...
- odd number、 even number
odd number 奇数 even number 偶数
- 为下拉式菜单(DropDownList)添加第一个选项
很多方法可以为为下拉式菜单(DropDownList)添加第一个选项,下面是Insus.NET小结了几个方法,仅供参考: Html code: <body> <form id= ...
- ios ViewController present不同的方向
First ViewController CATransition *transition = [CATransition animation]; transition.duration = 0.3; ...
- Linux学习3——磁盘文件管理系统与压缩和打包操作
一.写在前面 本节将对Linux的磁盘文件系统.文件的压缩打包等操作进行简要介绍. 二.完成目标 1.了解磁盘文件系统的接本知识 2.操作文件和目录的相关命令 3.文件系统的简单操作命令 4.Lin ...
- HDU 5781 ATM Mechine
题目大意:某个未知整数x等概率的分布在[0,k]中.每次你都可以从这个整数中减去一个任意整数y,如果x>=y,那么x=x-y,操作次数累计加1:否则,将会受到一次错误提示.当错误提示超过w次,将 ...
- .net通用权限框架B/S(一)
一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...
- OC——类
1.Objective-C是C语言的超集,完全兼容C语言 2.所有的关键字都以“@”开头,例如:@interface,@class,@implementation 3.Objective-C的所有对象 ...
- 轻松解决ubuntu系统引导问题
什么是ppa PPA,表示 Personal Package Archives,也就是个人软件包集. 有很多软件因为种种原因,不能进入官方的 Ubuntu 软件仓库. 为了方便 Ubuntu 用户使用 ...