【c语言进阶】深度剖析整形数据
🚀write in front🚀
📜所属专栏:
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我,你们将会看到更多的优质内容!!
文章目录
- 1.数据类型介绍
- 1.1类型的基本归类:
- 2.整形在内存中的存储
- 2.1原码,反码,补码:
- 2.2原码,反码,补码的相互转换:
- 2.3.大小端介绍:
- 2.4如何判断大小端(百度笔试题)
- 3.表达式求值
- 3.1.隐式类型转换:
- 3.2算术转化:
- 4.整形存储的例子
- 总结
1.数据类型介绍
我们知道,数据类型的意义是:
-
类型决定了开辟内存空间的大小。
-
类型决定了看待内存空间的视角(后面整形和浮点在内存中存储的差异就可以看出)
1.1类型的基本归类:
整形家族:
char unsigned
char signed charshort
unsigned short [int]
signed short [int]int unsigned
int signed intlong unsigned long [int] signed long [int]
注意:
char虽然是字符形式,但是存储的确实ASCII码值,而ASCII码是整形,所以char归于整形。
浮点型家族:
float
double
指针类型:
int pi;
char pc;
float pf;
void pv;
2.整形在内存中的存储
2.1原码,反码,补码:
计算机中的整数有三种2进制表示方法,即 原码、反码和补码 。
原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码
反码+1就得到补码。
注意:
1.三种表示方法均有符号位和数值位两部分,符号位都是用 0表示“正”,用 1表示“负”,而数值位
2正数的原、反、补码都相同。
3.负整数的三种表示方法各不相同。
对于整形来说,数据存放在内存中存的是补码,为什么呢?
原来,在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统
一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
2.2原码,反码,补码的相互转换:
我们只要记住:取反+1即可实现原码与补码的相互转换:
举一个例子:
int a = 20;
正数的原码反码补码相同
原码:00000000 00000000 00000000 00010100
反码:00000000 00000000 00000000 00010100
补码:00000000 00000000 00000000 00010100
int b = -10;
原码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101 ----符号位不变,其他按位取反
补码:11111111 11111111 11111111 11110110 ----反码+1
2.3.大小端介绍:
我们知道栈区是从高地址往低地址开始存变量,那么整形变量里的四个字节是怎么排序的呢,这里就涉及到了大小端的介绍。
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
我们来看看vs2022的小端模式就会清楚很多!
我们知道a的16进制是00 00 00 14,由图我们可以看出,数据的低位存在了内存的低地址,高位则存在了高地址,这就是小端的处理。
2.4如何判断大小端(百度笔试题)
我们可以通过1存入内存中在大小端字节存储的差异来判断大小端,我们知道,指针的类型决定了他能访问的空间,我们用char类型数组访问,小端的访问出01,大端访问出00,这就是区别所在,我们来看看代码:
int check_sys()
{int a = 1;//char *p=(char*)&a;//return *p;return *(char*)&a;
}
int main()
{int ret = check_sys();if (1 == ret){printf("小端\n");}else{printf("大端\n");}return 0;
}
3.表达式求值
3.1.隐式类型转换:
表达式中的字符和短整形操作数在使用之前都会被转换为普通整形(int)类型,这种转换称为整形提升。
那么电脑是如何整形提升的呢?
负数和正数的整形提升:
补最高位
eg:
char c=-1;
11111111
111111111111111111111111111111111111111
char b=1;
0000001
0000000000000000000000000000000001
无符号的整形提升:
高位补0
例子1:
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
实例1中的a,b要进行整形提升,但是c不需要整形提升
a的二进制是 0000 0000 1001 0110
截断后是 1001 0110
整形提升后是1111 1111 1001 0110
反码1000 0000 0110 1001
原码1000 0000 0110 1010
a,b整形提升之后,变成了负数,结果是假,但是c不发生整形提升,则表达式的结果是真.
所程序输出的结果是:c
例子2:
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof c ,就是1个字节
3.2算术转化:
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。排名顺序如下:
4.整形存储的例子
例子1:
a和b都是有符号char
10000000000000000000000000000001
11111111111111111111111111111110
11111111111111111111111111111111
11111111 - a 截断
11111111111111111111111111111111 - 提升
c是无符号char,提升的时候补0
10000000000000000000000000000001
11111111111111111111111111111110
11111111111111111111111111111111
00000000000000000000000011111111
答案是a=-1,b=-1,c=255
注意:
%d在读取时会读取符号位,而%u在读取时不会读取符号位!
例子2:
-128的原反补如下:
10000000000000000000000010000000
11111111111111111111111101111111
11111111111111111111111110000000 -128的补码
10000000 - a
整形提升后:
11111111111111111111111110000000
以%u的视角读取时,不会读出符号位,所以答案是一个很大的数字4,294,967,168。
例子3:
128的原反补如下:
00000000000000000000000010000000
01111111111111111111111101111111
01111111111111111111111110000000 -128的补码
10000000 - a
整形提升后:
11111111111111111111111110000000
以%u的视角读取时,不会读出符号位,所以答案是一个很大的数字4,294,967,168。
例子4:
int i = -20
10000000000000000000000000010100
11111111111111111111111111101011
11111111111111111111111111101100
unsign int j=10;
00000000000000000000000000001010
相加得:
11111111111111111111111111110110 - 补码
11111111111111111111111111110101
10000000000000000000000000001010
答案是-10
例子5:
我们知道unsigned int的范围一定是大于等于0的,所以当无符号的i=0时–会得到非常大的数字,会变成一个死循环,
因为0-1等于-1,
-1的补码为1111111111111111
而无符号数不看符号位,所以是很大的数4,294,967,295
具体循环为:
9 8 7 6 5 4 3 2 1 0 4,294,967,295 4,294,967,294…
例子6:
补充:
我们知道有符号char的范围是-128到127并且是一个轮回(因为超出范围后截断,还是在这个范围内)
所以这一题目的循环是-1 -2…-128 127 126 125…0 -1 -2 -3…-128 127—而我们知道,strlen在发现\0就会停止,所以a数组的长度为255.
例子7:
一样的,我们知道无符号char的范围是0到255,所以当i=255时再加1,会进1,使截断后全为0,所以255+1以后又变成0,又是一个死循环了。
总结
本站主要讲解了数据的基本类型、原码反码补码、大小端和整型的存储
这里我们额外要记住的是:
整型提升补的数字是又变量类型决定的,%d和%u只是决定了读取的时候是否读取符号位。
如果对你有帮助,不要忘记点赞加收藏哦!!!
想获得更多优质的博客,一定不要忘记关注我哦!!!
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!
专栏订阅:
每日一题
c语言学习
算法
智力题
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!
相关文章:

【c语言进阶】深度剖析整形数据
🚀write in front🚀 📜所属专栏: 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励…...
【信息系统项目管理师】项目管理十大知识领域记忆敲出(采购风险沟通干系人)
【信息系统项目管理师】项目管理十大知识领域记忆敲出(采购风险沟通干系人) 这里写目录标题【信息系统项目管理师】项目管理十大知识领域记忆敲出(采购风险沟通干系人)一.项目采购管理记忆敲出1.合同管理:2.规划采购管…...

[LeetCode 1237]找出给定方程的正整数解
题目描述 题目链接:[LeetCode 1237]找出给定方程的正整数解 给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。 尽管函数的具体式子未知…...

6.2 构建 RESTful 应用接口
第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战:实现 Web API 版本控制 6.2 构建 RESTful 应用接口 6.2.1 Spring Boot 对 RESTful 的支持 Spring Boot 提供的spring-boot-starter-web组件完全…...
20230218英语学习
How Italian Artist’s Mild Colors Dominate World of Design 温柔的“莫兰迪色”,如何引领设计时尚? The Morandi color scheme has become an across-the-board fashion that now prevails in the world of design.Soft and sophisticated Morandi c…...

Linux单一服务管理systemctl
基本上systemd这个启动服务机制只有systemctl命令来处理,所以全部的操作都需要使用systemctl systemctl管理单一服务 一般来说服务的启动有两个阶段,一个是开机是否启动,以及现在是否启动 systemctl【command】【unit】 command主要有&…...

【GStreamer 】 TX1中CPU和GPU解码显示海康相机RTSP流
大家好,我是虎哥,今天找了一套海康的相机,想后续测试一下DeepStream用网络相机RTSP流做输入看看后续目标识别和分类。但是还是想先实时看看视频,当然,可以选择VLC去查看,顺道我也用GStreamer 来测试了一下&…...
匿名内部类、Lambda表达式、方法引用对比分析
文章目录一、匿名内部类1. 语法格式2. 使用方法① 传统方式② 匿名内部类方式二、Lambda表达式1. 语法格式2. 使用方法① 匿名内部类方式② Lambda表达式方式三、方法引用1. 语法格式2. 使用方法① 类型的静态方法引用② 类型的构造方法引用③ 类型的实例方法引用④ 对象的实例…...

ESXi主机CVE-2021-21972漏洞复现安全处置建议
一、漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi、vCenter Server 等一系列的软件。其中 vCenter Server 为 ESXi 的控制中心,可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。 vSphere Client(HTML5…...

研报精选230217
目录 【行业230217毕马威】奢侈品行业新气象【行业230217国信证券】医药生物行业2023年2月投资策略:持续关注疫后复苏和创新两大主线【行业230217国金证券】航空锻造:稳定格局筑专业化壁垒,顺势而为拓产业链深度【个股230217西南证券_招商轮船…...
c++11 标准模板(STL)(std::unordered_set)(一)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

【C语言进阶】你听说过柔性数组吗?
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...

[LeetCode]1237. 找出给定方程的正整数解
题目链接:https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 题目描述: 样例1: 输入:function_id 1, z 5 输出:[[1,4],[2,3],[3,2],[4,1]] 解释:functi…...

【路径规划】基于A*算法和Dijkstra算法的路径规划(Python代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
蓝桥杯 stm32 PWM 设置占空比
本文代码使用 HAL 库。 文章目录 前言一、创建CubeMX 工程 ,占空比分析:二、相关函数:1. 获取 CNT函数2.设置CNT为 0 函数(计算器清零)3.开启TIM2_CH1的输入捕获中断函数4.TIM 回调函数三、设置上升沿,下降沿四、在lcd上显示 R40 占空比 详细代码五、设置占空比,输出 PW…...

React 合成事件理解
1 事件三个阶段 捕获、目标、处理 (具体百度,后面有空补全)2import React from "react";class Test extends React.Component {parentRef;childRef;constructor(props) {super(props);this.parentRef React.createRef();this.chil…...
202302|读书笔记——国图点滴
杂志剪影|看一本赚一本系列 anywhere 随心而行随心而动,极简相生复古文艺 热情洋溢 色彩斑斓 极致优雅 深邃魅力 新生绽放 灿若星空 异彩纷呈含苞待放 惊艳绽放 爱在云端 空中婚礼 暗夜浪漫 策马逐梦橘影相映 浆果红唇 梦幻无暇 永无止境浮光掠影 微酥清风低调奢华…...
Linux 操作系统原理 — NUMA 架构中的多线程调度开销与性能优化
目录 文章目录 目录前言NUMA 架构中的多线程性能开销1、跨 Node 的 Memory 访问开销2、跨 Core 的多线程 Cache 同步开销3、多线程上下文切换开销4、多线程模式切换开销5、中断处理的开销6、TLB 缓存失效的开销7、内存拷贝的开销NUMA 架构中的性能优化:使用多核编程代替多线程…...

OpenGL - 如何理解 VAO 与 VBO 之间的关系
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口LearnOpenGL 笔记 - 入门 04 你好,三角形 文章目录系列文章目录1. 前言2. 渲染管线的入口 - 顶点着色器2.1 顶点着色器处理过…...
Linux中sed的使用
语法: sed [选项] [sed内置命令字符] [输入文件]选项: 参数说明-n取消默认色的输出常与sed内置命令p一起使用-i直接将修改结果写入文件,不用-i,sed修改的是内存数据-e多次编译,不需要管道符了-r支持正则扩展 sed的内…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...