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

相关文章

来自专栏专注 Java 基础分享

全面理解java异常机制

      在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面...

1947
来自专栏Java成神之路

Spring_总结_04_高级配置(五)_运行时注入值

当讨论依赖注入的时候,我们通常所讨论的是将一个bean引用注入到另一个bean的属性或者构造参数中。它通常指的是将一个对象与另一个对象进行关联。

582
来自专栏积累沉淀

JavaScript事件

JavaScript事件 对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件模拟,事件方面的...

2076
来自专栏大数据挖掘DT机器学习

Python一些基础面试题目总结

1 Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 pytho...

3326
来自专栏Java进阶之路

Java中关于String类型的10个问题

1370
来自专栏Python小屋

Python版归并排序算法(附Python程序__name__属性用法演示视频)

import random def mergeSort(seq, reverse=False): #把原列表分成两部分 mid = len(s...

3076
来自专栏求索之路

Effective Java笔记(不含反序列化、并发、注解和枚举)

最近把Effective Java复习了一遍,其中有比较多的java最佳实践可以在平时编程中用到。反序列化、并发、注解和枚举这四章没看,并发这本书里讲的比较简...

33611
来自专栏Java架构师进阶

BATJ架构师常见面试题汇总之一 让你瞬间升华起来

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素...

442
来自专栏转载gongluck的CSDN博客

Lua学习笔记

--Lua笔记-- --0.Lua开篇-- --http://www.cnblogs.com/stephen-liu74/archive/2012/06/11/...

4246
来自专栏瓜大三哥

UVM(十二)之各register model续

UVM(十二)之各register model续 1. register model的必要性 假设有如下的DUT: ? 这个DUT相当的简单,它只有一个寄存...

2095

扫码关注云+社区