C理解(一):内存与位操作

news2024/12/25 12:26:27

本文主要探讨C语言的内存和为操作操作相关知识。

冯诺依曼结构和哈佛结构
        冯诺依曼结构:数据和代码放在一起,便于读取和修改,安全性低
        哈佛结构是:数据和代码分开存放,安全性高,读取和修麻烦

内存
        内存是用来存储全局变量、局部变量等变量
        操作系统把内存分成4kb页面以为单位来管理

        页面内以字节为单位通过管理接口(API)管理内存

内存属性
        内存属性:地址和空间
        空间:内存单元大小
        地址:内存条上的实际位置(物理地址)和逻辑地址(地址编号)一一对应
        内存单元类似方格,方格的位置为物理地址,方格的编号为逻辑地址,方格的空间为内存单元空间大小

内存和数据类型
        int类型与CPU数据位宽相同,32位的CPU的位宽是32位,int类型为32位,占4字节
        数据类型表示内存单元长度和解析方式
        int读取过程中,从起始处读取4个字节单元,再int的方式解析读取的内容

内存对齐
        内存对其访问效率高
        int类型变量对齐与非对齐
            对齐:    0 1 2 3    
            非对齐: 1 2 3 4    

变量访问内存
        int a;编译器申请int类型内存内存单元,把a和内存单元绑定
        a = 5;内存单元空间中写入5
        a += 4; 编译器先读a值再加4,最后重写写入到内存单元。


指针间接访问内存
        int a;int *p;
        a和p代表内存地址,内存地址长度和解析方法不同
        a为int型,长度是4字节,解析方式是int
        p是int *类型,长度是4字节,解析方法是int *

数组访问内存
        int b[10];
        编译器分配40个字节长度给b,首元素地址和b绑定
        每个元素类型都是int,长度是4字节
        第一个字节地址为首地址,首元素a[0]地址为首地址

(stack)
自动分配和回收内存
内存空间可反复使用
内存使用完不会清理,使用前需初始化
操作系统固定了栈大小,变量定义防止栈溢出
栈变量指针空间是临时的,同一变量每次初始化使用的是不同的内存地址空间
  
(heap)
堆管理内存分配灵活,按需分配
内存按需申请使用,使用完释放
内存空间可反复使用
内存使用完不会清理,使用前需初始化

内存申请
                void *malloc(size_t size);
                void *calloc(size_t nmemb, size_t size);  // nmemb个单元,每个单元size字节
                void *realloc(void *ptr, size_t size);    // 改变原来申请的空间的大小的
                malloc用来申请内存,返回void *类型指针,malloc返回申请内存空间首地址,失败返回NULL
                malloc只分配内存空间,空间存储的数据类型不做定义

代码段:程序中可执行部分
数据段(数据区、静态数据区、静态区):初始化为非零的全局变量,静态局部变量
bss段(ZI段):初始化为0或未初始化的全局变量

特殊数据
char *p = "linux";字符串分配在代码段,是常量不是变量
单片机编译过程中将const修饰变量放在代码段实现不能修改
gcc编译器将const修饰的变量放在数据段,只是默认不可修改,实际可通过地址访问修改

(32位操作系统)
位(1bit) 
字节(8bit) 
半字(16bit)  
字(32bit)

位操作
位操作:与& 或| 取反~ 异或^ 左移<< 右移>>
位清0 : & 0
位置1 : | 1
位取反 : ^ 1
特定位设置
#define SET_NTH_BIT(x, n)  (x | ((1U)<<(n-1)))
特定位清除
#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))
截取特定位
#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))

demo:
        位清除,设置,截取练习

#include <stdio.h>

int main()
{
        int a = 0x8a66;

        //设置bit3
        a |= (1<<3);
        printf("bit3 set :%x\n",a);

        //设置bit3 ~ bit8
        a |= (0x1f << 3);
        printf("bit3-8 set :%x\n",a);

        //清除bit5
        a  &= ~(1 << 5);
        printf("bit5 clear :%x\n",a);

        //清除bit6 ~ bit12
        a &= ~(0x3f << 6);
        printf("bit6-12 clear :%x\n",a);

        //设置bit9 ~ bit14为9
        a &= ~(0x1f << 9);
        a |= (12 << 9);
        printf("set 12 in bit9-14 :%x\n",a);

        //bit6 ~ bit12 加9,bit4 ~ bit7 加7
        int tmp = ((a & (0x3f << 6)) >> 6) + 9;
        a = (a & ~(0x3f << 6)) | (tmp << 6);
        tmp = ((a & (0xf << 1)) >> 1 ) + 7;
        a = (a & ~(0xf << 1)) | (tmp << 1);
        printf("bit6-12 + 9 and bit1-4 +7 :%x\n",a);

        return 0;
}

结果示例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt,神经网络与拥塞控制

chatgpt 是一个巨大的带答案的完形填空题库&#xff0c;它可以回答几乎所有的文字类问题&#xff0c;不保证完全正确&#xff0c;但大致正确。它是怎么做到的&#xff1f; 它怎么知道我要问什么&#xff0c;如果它知道我要问什么&#xff0c;那么问题的不同表达形式它也一定知…

如何利用AI算法+EasyCVR视频监控技术打造鱼塘养殖监管方案

对鱼塘养殖行业来说&#xff0c;养殖区域面积大、管理难&#xff0c;经常会遇到偷钓者、盗窃鱼苗、非法入侵等监管难题。传统的人工监管模式不仅耗费人力成本&#xff0c;而且监管效率低下&#xff0c;无法满足当前养殖户的需求。因此&#xff0c;搭建智能化的远程视频监控系统…

Linux 基本语句_5_创建静态库|动态库

静态库 创建主函数&#xff1a;main.c 应用函数&#xff1a;add.c、sub.c、mul.c 创建calc.h文件作为头文件 生成可执行文件*.o文件 gcc -c add.c -o add.o ....包装*.o文件为静态库 ar -rc libmymath.a add.o sub.o mul.o编译静态库并指明创建静态库的位置 sudo gcc mai…

原型、原型链、判断数据类型

目录 作用 原型链 引用类型&#xff1a;__proto__(隐式原型)属性&#xff0c;属性值是对象函数&#xff1a;prototype(原型)属性&#xff0c;属性值是对象 Function&#xff1a;本身也是函数 相关方法 person.prototype.isPrototypeOf(stu) Object.getPrototypeOf(objec…

论企业IPV4和IPV6网络融合互通网络规划设计

01、IPv6改造问题及整体改造思路 随着“十四五”期间国家政策对IPv6深化改造及规模部署的推动&#xff0c;在IPv6改造过程中出现了越来越多的系统性问题&#xff0c;如图1所示。 图1 关于IPv6改造的各种疑问 所有跨设备通信的IT软硬件系统均需要处理IP地址&#xff0c;各领域…

Android SDK目录结构

目录结构如下&#xff1a; 1&#xff1a;add-ons 该目录中存放 Android 的扩展库&#xff0c;比如 Google Maps&#xff0c;但若未选择安装 Google API&#xff0c;则该目录为空。 2&#xff1a;build-tools 编译工具目录&#xff1a;保存了Android开发常用的工具&#xff0…

【.NET源码解读】Configuration组件及自动更新

Configuration组件是.NET中一个核心的、非常重要的组件。它提供了一种方便的机制&#xff0c;用于从配置文件、环境变量、命令行参数等各种数据源中读取和配置应用程序&#xff0c;以满足不同环境下应用程序的需求。 在本篇文章中&#xff0c;将会介绍Configuration的基本用法…

使用Visual Studio调试排查Windows系统程序audiodg.exe频繁弹出报错

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

智慧燃气平台的总体架构到底应怎样设计?

关键词&#xff1a;智慧燃气、智慧燃气平台、智能燃气、智能监控 智慧燃气平台功能设计的一些方向和思考&#xff1a; 1、资源统一&#xff0c;管理调度 城市燃气智慧调度运营管理平台收集并且整理出每个业务系统信息&#xff0c;并且根据所整理出的信息结果制定出标准规范&…

Excel·VBA分列、字符串拆分

看到一篇博客《VBA&#xff0c;用VBA进行分列&#xff08;拆分列&#xff09;的2种方法》&#xff0c;使用VBA对字符串进行拆分 目录 Excel分列功能将字符串拆分为二维数组&#xff0c;Split函数举例 将字符串拆分为一维数组&#xff0c;正则表达式举例 Excel分列功能 Sub 测…

windows下使用VS2019 + CMake 进行Qt开发记录

windows下使用VS2019 CMake 进行Qt开发 前言一、准备工作二、VS2019 cmake3.20 Qt1.VS2019新建一个cmake工程2.修改CMakelist.txt3.运行测试 总结 前言 注意&#xff1a;本文讲的是vs2019 cmake的方式开发Qt程序。 常言道&#xff1a;工欲善其事必先利其器。工具利用的好…

数字货币的一些隐私保护问题

常见的数字货币基本模型 代表数字货币的不同架构和交易验证方式。 Account Based 基于账户的数字货币模型。主要特点 账户地址&#xff1a;每个用户都有一个唯一的账户地址&#xff0c;类似于银行账户号码。这个地址用来标识用户的身份&#xff0c;并用于接收、存储和发送…

多线程学习(C/C++)

1.进程 运行着的程序就是进程 进程的特性:1.独立性 2.动态性 3.并发性 (1)进程的状态 进程一共有五种状态分别为:创建态,就绪态,运行态,阻塞态(挂起态),退出态(终止态)其中创建态和退出态维持的时间是非常短的,稍纵即逝。我们主要是需要将就绪态, 运行态, 挂起态,三者…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

文件的编译与链接

目录 翻译环境与链接环境&#xff1a; 翻译环境&#xff1a; 编译器部分&#xff1a; 预处理&#xff1a; 编译&#xff1a; 词法分析&#xff1a; 语法分析&#xff1a; 语义分析&#xff1a; 汇编&#xff1a; 小总结&#xff1a; 链接器部分&#xff1a; 运行环境…

LLMS: 将模型与人类价值观对齐Aligning models with human values

欢迎回来。让我们回到 生成式 AI 项目的生命周期。 上周&#xff0c;你 仔细研究了一种叫做微调的技术。 使用 指令&#xff08;包括路径方法&#xff09;进行微调的目标是 进一步训练 模型&#xff0c;以便它们更好地理解 类似人类的提示并 生成更多类似人类的响应。 与基…

2023版 STM32实战5 基本定时器中断

基本定时器简介与特性 -1-时钟可分频 -2-计数模式只可以选择累加 -3-只可以用来定时&#xff08;含中断&#xff09; 查看时钟源 如图定时器7的时钟最大为72MHZ 定时时间的计算 通用定时器的时间计算公式为 Tout &#xff08;&#xff08;arr1&#xff09;&#xff08;psc1&…

[Framework] Android Binder 工作原理

Binder 是 Android 系统中主要的 IPC 通信方式&#xff0c;其性能非常优异。但是包括我在内的很多开发者都对它望而却步&#xff0c;确实比较难&#xff0c;每次都是看了忘&#xff0c;忘了看&#xff0c;但是随着工作的时间约来越长&#xff0c;每次看也都对 Binder 有新的认识…

【图像处理】SIFT角点特征提取原理

一、说明 提起在OpenCV中的特征点提取&#xff0c;可以列出Harris&#xff0c;可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取&#xff0c;只是管中窥豹&#xff0c;而更多的特征点算法有&#xff1a; Harris & Stephens / Shi–Tomasi 角点…

一种节约存储空间的技术——数据压缩

数据压缩是指&#xff1a;通过特定的算法&#xff0c;将计算的中的文件大小得到降低的一种机制。 目前生活中最常见的应用例子&#xff0c;比如&#xff1a;你通过聊天软件将一张图片发送给好友&#xff0c;再选择发送图片的时候&#xff0c;有一个选项为是否发送原图&#xf…