位域
来源:互联网 发布:c语言编程软件教程 编辑:程序博客网 时间:2024/04/29 18:51
{
char c:2;
int i:1;
};
cout << "struct T0{ char c:2; int i:1;} = " << sizeof(T0) << endl; //dev c++:4 vc6:8
typedef struct tag
{
char hour : 4 ;
unsigned second : 6 ;
unsigned minute : 6 ;
}Time;
printf( " %d " , sizeof (Time));
在gcc下的输出是4,在vc下的输出是8。
原 因是gcc把unsigned类型当成unsigned short来处理,Time.hour和Time.second共同占用一个unsigned short单元,minute独占一个unsigned short单元,再加上对其所需的空白,总共是2个unsigned short, 则sizeof为4。
而VC把位域的unsigned类型当做unsigned int,所以Time占用2个unsigned int,sizeof值为8。
示例
下面是一段在论坛上发现的代码,
union
{
struct
{
char a : 1 ;
char b : 2 ;
char c : 3 ;
}d;
char e;
}f;
f.e = 1 ;
printf( " %d " , f.d.a);
Intel x86的机器是按little-endian的字节顺序存储数据(点击for详细),所以d中的位域在内存中放置顺序为 cccbba ,
当执行完 f.e = 1 这条语句后,d的最低有效位(及位域a)的值为1。
这时我就出现了疑问,为什么打印的最后结果是-1而不是1?
不过最后终于解决了这个问题,因为位域a定义的类型是signed char,是一个有符号数,所以尽管a只有1位,还是要进行符号扩展。1是做为补码存在,加一再取反就得到值-1。
如果将a的类型定义为unsigned char即可得到结果为1。
查看:http://bbs.suda123.com/Archiver/webbiancheng/thread-252105-1.html
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 解决.bin文件不能执行的问题
- c# FTP 断点上传
- 去什么样的公司
- ORA-00257的错误代号及解决
- C#多线程强制退出程序
- 位域
- 企业--不同的角度,不同的观点1
- 防黑15招保障企业Web服务器安全
- 学习opencv,遇到'cvLoadImage' : too few actual parameters
- ASP.NET循序渐进--2、第一个ASP.NET网页程序
- 连接数据库时设置编码格式
- linux 下的一些系统命令
- 踏踏实实做事,老老实实做人
- 派生类的构造函数 与基类的调用关系