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

本文主要探讨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;//设置bit3a |= (1<<3);printf("bit3 set :%x\n",a);//设置bit3 ~ bit8a |= (0x1f << 3);printf("bit3-8 set :%x\n",a);//清除bit5a  &= ~(1 << 5);printf("bit5 clear :%x\n",a);//清除bit6 ~ bit12a &= ~(0x3f << 6);printf("bit6-12 clear :%x\n",a);//设置bit9 ~ bit14为9a &= ~(0x1f << 9);a |= (12 << 9);printf("set 12 in bit9-14 :%x\n",a);//bit6 ~ bit12 加9,bit4 ~ bit7 加7int 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.mzph.cn/news/90603.shtml

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

相关文章

Prometheus+Grafana监控K8S集群(基于K8S环境部署)

文章目录 一、环境信息二、部署前准备工作三、部署Prometheus监控系统四、部署Node_exporter组件五、部署Kube_state_metrics组件六、部署Grafana可视化平台七、Grafana可视化显示Prometheus收集数据八、Grafana添加监控模板九、拓展 一、环境信息 1、服务器及K8S版本信息&…

Nim游戏

891. Nim游戏 - AcWing题库 全部异或起来&#xff0c;如果不为零&#xff0c;则可以一步使其变为0&#xff1a; 设异或和为x&#xff0c;x的最高位为第k位&#xff0c;令第k位为1的a[i]变为a[i]^x&#xff0c;a[i]^x < a[i]&#xff0c;这样就可以使异或和为0。 如此往复最…

目标检测如何演变:从区域提议和 Haar 级联到零样本技术

目录 一、说明 二、目标检测路线图 2.1 路线图&#xff08;一般&#xff09; 2.2 路线图&#xff08;更传统的方法&#xff09; 2.3 路线图&#xff08;深度学习方法&#xff09; 2.4 对象检测指标的改进 三、传统检测方法 3.1 维奥拉-琼斯探测器 (2001) 3.2 HOG探测器…

el-table实现穿梭功能

第一种 <template><el-row :gutter"20"><el-col :span"10"><!-- 搜索 --><div class"search-bg"><YcSearchInput title"手机号" v-model"search.phone" /><div class"search-s…

EasyX趣味化编程note2,绘制基本图形

创意化编程&#xff0c;让编程更有趣 今天介绍的仍为比较简单的效果&#xff0c;由浅入深来进行学习 介绍每个函数都会附上代码和运行结果&#xff0c;感兴趣的大家可以复制粘贴运行一下看看效果&#xff0c;也可以自己进行改动&#xff0c;非常好玩且加深印象。 上节课的知识…

idea Springboot在线商城系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 在线商城系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有 完整的源代码和数据库&…

机器学习笔记:Huber Loss smooth L1 loss

1 Huber loss 1.1 介绍 Huber Loss是回归问题中的一种损失函数&#xff0c;它结合了均方误差MSE和绝对误差MAE的特点。 Huber Loss在误差较小的时候是平方损失&#xff0c;而在误差较大的时候是线性损失。因此&#xff0c;它在处理有噪声的数据时&#xff0c;尤其是存在离群点…

手机搜狗输入法,输入拼音时如何分割拼音,调出“分词“功能,如何微信或QQ使用发送按钮而不是换行?

背景 有时候打字&#xff0c;输入 “xian” 的时候我们的意图是 “xi’an” &#xff08;西安&#xff09;&#xff0c;或者输入 “yue” 的时候希望是 “yu’e”&#xff08;余额&#xff09; 如何输入这个分隔符 ’ 呢&#xff1f; 设置方法 默认页面如图 希望设置成 点…

家电行业 EDI:Miele EDI 需求分析

Miele是一家创立于1899年的德国公司&#xff0c;以其卓越的工程技术和不懈的创新精神而闻名于世。作为全球领先的家电制造商&#xff0c;Miele的经营范围覆盖了厨房、洗衣和清洁领域&#xff0c;致力于提供高品质、可持续和智能化的家电产品。公司的使命是为全球消费者创造更美…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中&#xff0c;聚合函数是一组强大的工具&#xff0c;用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户&#xff0c;了解聚合函数都是非常重要…

CSS详细基础(四)显示模式

本帖开始介绍CSS中更复杂的内容 目录 一.显示模式 1.行内元素 2.块级元素 3.行内块元素 二.背景样式 一.显示模式 顾名思义&#xff0c;在CSS中&#xff0c;元素主要有3种显示模式&#xff1a;行内元素、块级元素、行内块元素~ 所谓块级元素&#xff0c;指的是该元素在…

ChatGPT AIGC 非常实用的AI工具集合大全

实战AI 工具箱 AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

GD32工程创建

1.创建空工程 在任意路径下创建空的test文件夹。打开keil5空工程创建空工程 选择对应的芯片型号&#xff1a; 然后把空工程保存到test文件夹下。会自动生成如下文件。 2. 添加组 下载GD32F10X的固件库&#xff1a;在百度里搜索GD32进入官网。 下载下来对应的文件如下&#xff…

MYSQL常用命令

一.数据类型 MySQL中有多种数据类型&#xff0c;每种类型用于存储不同类型的数据。以下是MySQL中常见的数据类型&#xff1a; 数值类型&#xff1a; INT&#xff1a;整数类型&#xff0c;存储范围为-2,147,483,648到2,147,483,647。BIGINT&#xff1a;大整数类型&#xff0c;存…

【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch云朵降雨 一、题目要求 编程实现 二、案例分析 1、角色分析

AHH HackerHouse @Move大理站完美谢幕

Antalpha HackerHouse Move 大理站于2023年9月23日在面包树举办了Final DemoDay&#xff0c;这也代表着为期21天的 HackerHouse 活动完美谢幕。 自从9月3日开始&#xff0c;整整21天的共居时间里&#xff0c;我们从个体逐渐融汇成小团队&#xff0c;最终成为了一个紧密团结的大…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

软件测试之单元测试自动化入门基础

单元测试自动化 所谓的单元测试(Unit Test)是根据特定的输入数据&#xff0c;针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构&#xff1a;函数&#xff0c;类&#xff0c;模块等。在Python中比较知名…

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…