【编程基础】C语言位

位制就是为了减小存储大小,把一个char, unsigned int, int的存储空间进行拆分后,对每个进行操作。 给出一段代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct test{    
    char a: 4;    
    char b: 1;    
    char c: 1;
}test;

int main(){
    test m; 
    m.a = 3;    
    m.b = 3;    
    m.c = 3;    
    printf("%d/n" ,sizeof(test));
    printf("%d/n" ,sizeof(char));
    return 0;
}

上面的代码运行后发现,输出为1 ,1。

也就是说,test的长度和char的长度是一样的。其实说白了test就是把一个char类型的存储空间,拆分成4位,1位,1位的存储空间进行操作。

下面,如果test里的大小类型不一致呢:

#include <stdio.h>
#include <stdlib.h>

typedef struct test{    
    char a: 4;    
    char b: 1;    
    int c: 1;
}test;

int main(){ 
    test m;    
    m.a = 3;    
    m.b = 3;    
    m.c = 3;    
    printf("%d/n" ,sizeof(test));
    printf("%d/n" ,sizeof(char));    
    printf("%d/n" ,sizeof(int));
    return 0;
}

代码输出为 8, 1, 4。

这里应该是有一个对其的概念,也就是说test把char类型的也扩张成4字节的了,为了跟int的对齐。

对位制,不能把设置的位数长度大于类型的长度,比如

typedef struct test{
    char a: 10;    
    char b: 1;    
    char c: 8;
}test;

这里10已经超过了char类型的长度,所有编译错误。

还有对于如果总长度大于设置的类型呢

#include <stdio.h>
#include <stdlib.h>

typedef struct test{    
    char a: 8;    
    char b: 1;    
    char c: 8;
}test;

int main(){ 
    test m;    
    m.a = 3;    
    m.b = 3;    
    m.c = 3;    
    printf("%d/n" ,sizeof(test));    
    printf("%d/n" ,sizeof(char));    
    return 0;
}

输出结果为3, 1 可以看出来,test自动分配了三个char类型的空间。大体了解了吧。

本文摘自:南岭以北

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

malloc和new有什么区别

malloc和new有以下不同: new、delete是操作符,可以重载,只能在c++中使用。 malloc、free是函数,可以覆盖,c、c++中都可以使用。...

18810
来自专栏noteless

[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式

前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明

1882
来自专栏lgp20151222

Class.forName()用法详解

主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,...

2031
来自专栏我是业余自学C/C++的

redis_3.0.7_sds.c_sdsIncrLen()

1232
来自专栏我爱编程

Python DEBUG

>>> l = [3] >>> l() Traceback (most recent call last): File "<pyshell#77>", li...

2984
来自专栏软件开发 -- 分享 互助 成长

快速排序

如果说希尔排序是简单插入排序的升级,堆排序是简单选择排序的升级,那么快速排序就是冒泡排序的升级了。相对于冒泡排序,快速排序增大了记录比较和移动的距离,将关键字较...

2106
来自专栏编程坑太多

python--面向对象与模块补充,反射

1814
来自专栏从流域到海域

《笨办法学Python》 第32课手记

《笨办法学Python》 第32课手记 本节课讲for循环和list,list里类似于c中的数组,但有区别很大。C语言中的数组是数据类型相同的值的集合,list...

2089
来自专栏Java学习网

Java面试中最常见的10个问题,Java底层知识,花点时间学习一下

1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文...

2735
来自专栏人工智能LeadAI

Python中defaultdict用法

defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值

1074

扫码关注云+社区

领取腾讯云代金券