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

相关文章

来自专栏Bingo的深度学习杂货店

Q58 Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characte...

3265
来自专栏章鱼的慢慢技术路

《算法图解》第二章笔记与课后练习

13210
来自专栏Java面试笔试题

List、Map、Set三个接口存取元素时,各有什么特点?

List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value p...

582
来自专栏我是攻城师

Python之numpy的ndarray数组使用方法介绍

NumPy的全名为Numeric Python,是一个开源的Python科学计算库,它包括:

903
来自专栏章鱼的慢慢技术路

《算法图解》第二章笔记与课后练习_选择排序算法

1333
来自专栏Pulsar-V

GTK基础操作类

1 类型定义 整数类型:gint8、guint8、gint16、guint16、gint31、guint32、gint64、guint64。不是所有的平台都提...

2505
来自专栏Python

python中__get__,__getattr__,__getattribute__的区别

__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同。  object.__getattr__(self, nam...

950
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组...

1897
来自专栏web前端教室

javascript 红皮高程(10)

继续string类型的相关知识哈,不细看不知道啊,这JS的知识点真是太细碎了。因为许多知识点都互相交织着,但某些属性却并不是所有的对象都有。例如: 转换字符...

1797
来自专栏海天一树

字符串匹配:BF算法

(一)算法原理 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比...

2759

扫描关注云+社区