C语言结构体位域
来源:互联网 发布:同济大学软件学院 编辑:程序博客网 时间:2024/05/04 13:42
来看下面一段代码:
#include<stdio.h>struct data{ int a : 1; int b : 31;};int main(){ struct data test; test.a = 1; if(test.a == 1) printf("a == 1\n"); else printf("a !=1\n"); printf("a = %d",test.a);}
这段代码的结构体中定义了一个int型的位域变量,想用来接收0或1,按照这样的话将1赋给a后那么程序的结果应该是“a==1”。但实际上结果如下:
这是因为,当把1存放到内存时,计算机会认为这是一个负数,负数在内存中以补码的形式存在,原码就是-1。
我们都知道,在32位编译器中最大的正数就是后面31位全为1,最高位为符号位,如果全1则表示补码,原码为-1。
而如果int是无符号类型则不存在此问题,将上面代码的int声明为无符号类型则可得到期望结果,我这里程序运行的结果如下:
4 0
- c语言结构体位域
- C语言结构体位域
- C 结构体位域
- c语言构造体位域(转)
- C语言结构体位段特性实现断言宏
- 结构体位域操作
- 结构体位域
- 结构体位域操作
- 结构体位域
- 结构体位域
- 结构体位域
- 结构体位域
- 结构体位域操作
- 结构体位制详解 -- C
- (原创)结构体位域操作
- 结构体位域的含义
- 共用体结构体位域的应用
- 关于结构体对齐和结构体位域的问题
- 用pethon 抓取网站图片代码
- netty in action第六章-ChannelHandler
- iOS在当前视图隐藏tabbar
- 2015.03.20使命
- java基础day02
- C语言结构体位域
- 如何选择机器学习算法(转、译)
- jquery中把字符串转换为数字
- 把一个十进制数的二进制形式翻转,并输出翻转后所对应的十进制数
- linux下布署java和定时任务
- GFP_KERNEL or SLAB_KERNEL?
- phpstudy配置伪静态的方法
- android中的常见算法整理
- Driver porting: low-level memory allocation