首页 > 其他分享 >C语言位域操作底层发生了什么?

C语言位域操作底层发生了什么?

时间:2023-05-15 21:24:40浏览次数:43  
标签:字节 void C语言 char 内存 位域 底层

  我们知道CPU对内存访问的最小单位是字节,1个字节是8个位,但是有时候我们需要的变量只需要不到8个位就能存的下,为了节省内存就会使用位域。

  比如我只需要1个变量的低2位变成10b,而其他位不受影响,我们会这么写:

1 void main(void)
2 {
3     volatile char a;
4     a &= 0xFC;
5     a |= 0x20;
6 }

  除此之外还可以用位域,代码如下:

 1 struct weiyu {
 2    char a:2;
 3    char b:6;
 4 };
 5 
 6 void main(void)
 7 {
 8     volatile struct weiyu k;
 9     k.a = 2;
10 }

  两种方法相比较,第二种方法看上去更直观,且写的时候不容易出错,那么问题来了,CPU对内存访问的最小单位是字节,那第二种方法是如何做到如代码那样的只访问某个域呢?这个时候就要看汇编代码了,用keil建立一个简单的单片机工程,用模拟仿真分别运行一下这两段代码,结果对比如下图:

  

  可以看到,虽然C语言写法不同,但是翻译成汇编的结果是一模一样的。

 

标签:字节,void,C语言,char,内存,位域,底层
From: https://www.cnblogs.com/Suzkfly/p/17403153.html

相关文章

  • 编程打卡:C语言程序设计
    packagemainimport"os"import"fmt"import"simplemath"import"strconv"varUsage=func(){fmt.Println("USAGE:calccommand[arguments]...")fmt.Println("\nThecommandsare:\n\tadd\tAddition......
  • C语言笔记
    C基本语法我们已经看过C程序的基本结构,这将有助于我们理解C语言的其他基本的构建块。C的令牌(Token)C程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的C语句包括五个令牌:printf("Hello,World!\n");这五个令牌分别是:printf......
  • 啊哈C语言案例学习笔记
    HelloWorld#include<stdio.h>/*技术要点:初学者在编写程序时,经常会忘记在语句后边添加分号,*/intmain(){ printf("helloworld"); printf("\n");//换行 return0;}求和运算/*编写程序:计算10+20并输出结果*解题思路:*(1)定义一个数据类型*i、......
  • 打卡 c语言趣味编程 二分查找算法实现
    N个有序整数数列已放在一维数组中,利用二分查找法查找整数在数组中的位置。若找到,则输出其下标值;反之,则输出“Notbefound!”。思路:二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,这些子问题互相独......
  • C语言getifaddrs()通过网口IP获取网口名
    原文地址:https://www.cnblogs.com/liqinglucky/p/getifaddrs.html用C语言实现通过ip地址获取到本地网口名。比如我知道网口IP是173.1.4.53,怎么通过这个IP匹配出网口是ens9?#ipaddr1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1......
  • Pycharm的使用和python的部分底层原理
    pycharm的使用1.基本使用1.如何切换主题file(文件)>>>> settings(工具) >>>>  Apperance&behavior(外观和性能)>>>>  Apperance(外观) >>>>  Theme(主题) 2.如何切换不同版本的翻译器file(文件)>>>>  settings(工具) >>>> ......
  • [每天例题]蓝桥杯 C语言 字符统计
    字符统计题目思路分析1.建立字符数组,存储字符串2.建立整形数组,储存对应字母出现的次数3.使用for循环进行排序,使用if判断最大最小值代码#include<stdio.h>intmain(){chara[1000000];intnum[26]={0};inti;intmax=0;scanf("%s",&a);......
  • C语言整数位运算中的一些技巧
    1与(&)1.与(&)运算实现求余%运算在计算机里整数求余运算比较低效,在对2的整数幂进行求余时,可以使用&来优化如:a对2^n(n为自然数)求余:a%(2^n)=a&((2^n)-1)//如a%4=a&0x3判断奇数偶数时,可以与1相与if(n&0x1==0x1){//printf("n是奇数");......
  • Spring底层原理与源码
    Bean生命周期步骤详情UserService->无参构造方法->普通对象->依赖注入(给对象赋值)->afterPropertiesSet()->初始化后(AOP)->代理对象->Map<beanName,Bean对象>:单例池Bean实例化->JVM实例化Bean初始化->afterPropertiesSet()......
  • C语言之环形队列
    一、环形队列的优势环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。下面我们来详细讲解一下环形队列的......