【编程基础】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 条评论
登录 后参与评论

相关文章

来自专栏noteless

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

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

1442
来自专栏决胜机器学习

PHP面向对象核心(二)——继承、多态、接口

PHP面向对象核心(二) (原创内容,转载请注明来源,谢谢) 三、继承与多态 3.1 继承 1、继承是类级别的复用,关键词为extends;多态是方法级别的复用...

35712
来自专栏我爱编程

Python DEBUG

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

2814
来自专栏漫漫深度学习路

python命名空间

python的命名空间 python使用命名空间记录变量。python中的命名空间就像是一个dict,key是变量的名字,value是变量的值。 python中...

1926
来自专栏GreenLeaves

JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍

1、原型模式的重要性不仅仅体现在创建自定义类型方面,就连所有的原生的引用类型(Obejct、Array、String等等)都在构造函数的原型上定义方法和属性。如...

20510
来自专栏猿人谷

malloc和new有什么区别

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

17810
来自专栏lgp20151222

Class.forName()用法详解

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

1141
来自专栏racaljk

关于C++函数返回局部对象的详细分析

以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的。因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象...

2631
来自专栏风中追风

==和equals的区别

==比较的是内存地址,equals方法在object里源代码也是用==来比较,比较的也是内存地址;

3157
来自专栏C/C++基础

C++11 原生字符串

原生字符串(Raw String)指不进行转义“所见即所得”的字符串。很多编程语言早已支持原生字符串,如C#、Python、Shell等。C++作为一门高级程序...

1401

扫码关注云+社区