【C语言进阶】数据的存储----整型篇

news2024/11/18 3:23:50

🍁 博客主页:江池俊的博客

💫收录专栏:C语言——探索高效编程的基石
💻 其他专栏:数据结构探索
💡代码仓库:江池俊的代码仓库
🎪 社区:GeekHub

🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞

文章目录

  • 🌴数据类型介绍
    • 📌类型的基本归类:
  • 🌴整形在内存中的存储
    • 📌原码、反码、补码
    • 📌大小端介绍
      • 1. 什么是大端小端:
      • 2.为什么有大端和小端:
  • 🌴练习
    • 📌1.百度2015年系统工程师笔试题:
    • 📌2.练习2
    • 📌3.练习3
    • 📌4.练习4
    • 📌5.练习5
    • 📌6.练习6
    • 📌7.练习7

🌴数据类型介绍

- 基本的内置类型:

1. char1个字节          ----->字符数据类型
2. short 2个字节       -----> 短整型
3. int 4个字节        ----->整形
4. long 4/8个字节        ----->长整型
5. long long8个字节     -----> 更长的整形
6. float4个字节        -----> 单精度浮点数
7. double8个字节          -----> 双精度浮点数
注意C语言中没有字符串类型
类型的意义:

  1. 内存占用和范围:不同的数据类型在内存中占用不同的字节数,并且能够表示的数值范围也不同。正确选择数据类型可以优化内存使用,同时确保数据不会超出所允许的范围,避免溢出和精度丢失的问题。
  2. 数据操作和运算规则:不同数据类型支持不同的操作,并且对于不同数据类型之间的运算有明确的规则。了解这些规则可以帮助开发者正确地处理数据,避免数据转换错误和意外的计算结果。
  3. 类型检查和数据表达:C语言是一种静态类型语言,编译器在编译时会对数据类型进行检查。正确定义数据类型可以帮助发现类型错误和潜在问题,增强代码的可靠性。此外,不同的数据类型也能够更直观地表达数据,使代码更易读和理解。

📌类型的基本归类:

  • 整形家族:
  1. char
    unsigned char:无符号字符型,范围为 0 到 255。
    signed char:一个字节大小的有符号整数,范围为 -128 到 127。
    注意:char是否为signed char,C语言标准并没有规定,取决于编译器。
    字符在内存中存储的是字符的ASCII码值,ASCII码值是整型,所以字符类型归类到整型家族
  2. short
    unsigned short [int]:无符号短整型,范围为 0 到 65,535。
    signed short [int]:两个字节大小的有符号整数,范围为 -32,768 到 32,767。
  3. int
    unsigned int:无符号整型,范围为 0 到 4,294,967,295。
    signed int:四个字节大小的有符号整数,范围为 -2,147,483,648 到 2,147,483,647。
  4. long
    unsigned long [int]:无符号长整型,范围取决于编译器,但至少和 unsigned int 类型的范围相同。
    signed long [int]:四个或八个字节大小的有符号整数,范围取决于编译器,但至少是 int 类型的范围。

以下以char的两种类型为例(其他类型类似),我们可以利用画圈的方法来方便我们的记忆,我个人让我这是一个非常好的方法(牛🖊)具体参照下方两幅图片:
signed char类型范围
unsigned char类型范围

  • 浮点数家族:
  1. float::float是单精度浮点类型,通常占用4个字节(32位)。它可以表示大约6到7位有效数字,并且具有范围约为1.2E-38到3.4E+38的取值范围。在表示浮点数时,通常使用后缀f或F来标识float类型,例如:3.14f。
  2. double:double是双精度浮点类型,通常占用8个字节(64位)。它可以表示大约15到16位有效数字,并且具有更大的范围,约为2.3E-308到1.7E+308。在表示浮点数时,C语言通常默认为double类型,不需要显式指定后缀。例如:3.14表示的是double类型。
  • 构造类型:
  1. 数组类型
  2. 结构体类型 struct
  3. 枚举类型 enum
  4. 联合类型 union
  • 指针类型:

1. int *pi;
2. char *pc;
3. float* pf;
4. void* pv;(无具体类型的指针)

  • 空类型:

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。

🌴整形在内存中的存储

我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

那接下来我们谈谈数据在所开辟内存中到底是如何存储的?

比如:

int a = 20;
int b = -10;

我们知道为 a 分配四个字节的空间。
那如何存储?
下来了解下面的概念:

📌原码、反码、补码

计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,数值位
正数的原、反、补码都相同。
负整数的三种表示方法各不相同。

在我上一篇文章中也有涉及到,具体请移步【C语言】操作符—详解

  • 原码
    直接将数值按照正负数的形式翻译成二进制就可以得到原码。
  • 反码
    将原码的符号位不变,其他位依次按位取反就可以得到反码。
  • 补码
    反码+1就得到补码。

注意:补码+1得到的是原码。

对于整形来说:数据存放内存中其实存放的是补码。
为什么呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程 是相同的,
不需要额外的硬件电路。

我们看看在内存中的存储:
注意:这里是各个变量对应补码的16进制表示形式
在这里插入图片描述
我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。
这是因为数据的存储被分为大小端两种情况。

📌大小端介绍

1. 什么是大端小端:

- 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
- 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

2.为什么有大端和小端:

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元
都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short
型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32
位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因
此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为
高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高
地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则
为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式
还是小端模式。

🌴练习

📌1.百度2015年系统工程师笔试题:

题目描述:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)

思路
因为1的二进制序列的16进制表示形式为00 00 00 01,所以如果机器是小端字节序存储形式,那么整型 1 在内存中存储地址由低到高依次为 01 00 00 00;如果机器是大端字节序存储形式,那么在整型 1 在内存中存储地址由低到高依次为 00 00 00 01,这时我们可以利用字符(cha)型指针访问此地址存储的值,因为char型指针一次只能访问一个字节,所以如果是小端,则访问的值为01,如果是打端,则访问的值是00。

#include <stdio.h>
int check_sys()
{
 int i = 1;
 return (*(char *)&i);
}
int main()
{
 int ret = check_sys();
 if(ret == 1)
 {
 printf("小端\n");
 }
 else
 {
 printf("大端\n");
 }
 return 0;
}

📌2.练习2

//下面程序输出什么?
#include <stdio.h>
int main()
{
    char a= -1;
    //10000000000000000000000000000001 -a的原码
    //11111111111111111111111111111110
 	//11111111111111111111111111111111 -a的补码
 	//11111111 - a
    signed char b=-1;
    //11111111 - b
    unsigned char c=-1;
    //11111111 - c
    printf("a=%d,b=%d,c=%d",a,b,c);//结果为a=-1 b=-1 c=255
    //%d 是以10进制的形式打印有符号的整数
    //打印时a,b为有符号的char,所以打印时将第一个1看成符号位,在左边补上24个1
    //所以打印时a,b又变成11111111111111111111111111111111,但这是补码,
    //打印的数字需要为原码对应的值,所以转换为原码为 
    //10000000000000000000000000000001,对应的十进制为-1
    //而c为无符号的char,所以打印时不分符号位,左边补上24个0
    //即为00000000000000000000000011111111,
    //因为无符号为正数,所以原码补码相同,对应的十进制为255 
    return 0;
}

📌3.练习3

#include <stdio.h>
int main()
{
    char a = -128;
    //10000000000000000000000010000000 -a的原码
	//11111111111111111111111101111111
	//11111111111111111111111110000000 -a的补码
	//10000000 - 内存中存储的a
	//打印时需要整型提升,此时看a的类型,因为a的类型为有符号的char,
	//所以将内存中a的首位看成符号位,为1则左边全补上1;为0,则全补0
	//即:11111111111111111111111110000000 ---将它看成无符号的数打印,
	//则它是一个很大的数,值为:4294967168
    printf("%u\n",a);//结果为:4294967168
    //%u 是10进制的形式,打印无符号的整数
	//%d 是10进制的形式,打印有符号的整数
    return 0;
}
#include <stdio.h>
int main()
{
    char a = 128;
    //00000000000000000000000010000000 -a的原码,反码,补码
    //10000000 -内存中存储的a
	//11111111111111111111111110000000 - a整型提升后的值
    printf("%u\n",a);//结果为:4294967168
    //%u 是10进制的形式,打印无符号的整数
	//%d 是10进制的形式,打印有符号的整数
    return 0;
}

📌4.练习4

int i= -20;
//10000000000000000000000000010100 -i的原码
//11111111111111111111111111101011
//11111111111111111111111111101100 -i的补码
unsigned  int  j = 10;
//   00000000000000000000000000001010 -j的原码,反码,补码
// + 11111111111111111111111111101100
// = 11111111111111111111111111110110 -i+j的补码
//   10000000000000000000000000001001 -i+j的反码
//	 10000000000000000000000000001010 -i+j的原码,对应十进制值为:-10
printf("%d\n", i+j); //结果为:-10
//按照补码的形式进行运算,最后格式化成为有符号整数

📌5.练习5

unsigned int i;//因为是无符号的整型,所以i一直大于等于于0
for(i = 9; i >= 0; i--)
{
    printf("%u\n",i);
}//所以此代码会进入死循环

如图说示,i=9开始,逆时针走,一直在0~65535这个范围内。
unsigned int类型范围

📌6.练习6

int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
    //这里也可以使用画圈的方法,数组中的值从-1开始一直到0,如下:
    //-1 -2 -3 -4 -5 .. -128 127 .. 6 5 4 3 2 1 0  
    //-1~-128一个有:128个数,127~1一共有:127个数,所以共有:128 + 127 = 255
   }
    printf("%d",strlen(a));
    //strlen 统计的是\0之前出现的字符的个数
	//'\0' - 对应的ASCII码值:0 
    return 0;
}

📌7.练习7

#include <stdio.h>
unsigned char i = 0;
//无符号的插入取值范围在0~255之间
int main()
{
    for(i = 0;i<=255;i++)
    //i的值从0到255,然后再从255到0,一直这样循环
   {
        printf("hello world\n");
        //陷入死循环
   }
    return 0;
}

🔥今天的分享就到这里,如果觉得博主的文章还不错的话,请👍三连支持一下博主哦🤞
在这里插入图片描述

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

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

相关文章

数据库索引失效的情况

1.对添加了索引的字段进行函数运算 2.如果是字符串类型的字段&#xff0c;如果不加单引号也会导致索引失效 3.如果最索引字段使用模糊查询&#xff0c;如果是头部模糊索引将失效&#xff0c;如果是尾部模糊索引则正常 4.如果使用or分割符&#xff0c;如果or前面的条件中的列有…

JUC并发编程(二)ForkJoinPool、Future、CompletableFuture、CAS

文章目录 ForkJoin分治工作窃取ForkJoinPool与ThreadPoolExecutor使用案例不带返回值的计算--RecursiveAction带返回值的计算--RecursiveTask Future 异步回调烧水案例join实现FutureTask实现 CompletableFuture为什么叫CompletableFuture?创建异步任务supplyAsyncrunAsync获取…

Vue插槽 、自定义指令、render函数、过滤器和插件

目录 插槽 自定义指令 directive 全局注册 局部注册 钩子函数 render渲染函数 过滤器 插件 plugin 插槽 普通插槽&#xff0c;具名插槽&#xff0c;作用域插槽 插槽允许我们在调用子组件的时候为子组件传递模板。 <slot> 元素作为承载分发内容的出口。 一个不带…

双链表(带哨兵位头节点)

目录 ​编辑 双链表的初始化&#xff1a; 双链表的打印&#xff1a; 双链表的尾插&#xff1a; 双链表的头插&#xff1a; 双链表的尾删&#xff1a; 双链表的头删&#xff1a; 双链表pos位置之前的插入&#xff1a; 双链表pos位置的删除&#xff1a; 关于顺序表和链表…

MyBatis-Plus实现分页查询

目录 MyBatis-Plus实现分页查询 代码 定义一个MyBatis-Plus拦截器 在连接数据库的配置文件中添加MyBatis-Plus日志查看MyBatis-Plus的SQL语句 测试 运行结果 MyBatis-Plus实现分页查询 代码 定义一个MyBatis-Plus拦截器 package com.dong.config;import com.baomidou.my…

windows下mysql的下载与安装

文章目录 1 下载2 安装目录下新建data文件夹和my.ini3 安装4设置密码与远程连接5 配置环境变量6 navicate连接成功 1 下载 官网地址 https://www.mysql.com/点击下载 社区下载 社区服务 选择版本下载 2 安装目录下新建data文件夹和my.ini my.ini 内容如下 [mysql] # 设置my…

iphone内存不足导致白苹果?可以使用这2种办法解决!

因为iPhone内存不足没及时清理导致打开任何软件闪退&#xff0c;这时很多小伙伴会重启手机来解决闪退问题&#xff0c;但就会出现白苹果问题&#xff0c;无法正常进入手机系统、实现任何操作的一种状态。 内存不足导致iPhone白苹果的问题很常见&#xff0c;可以说是苹果最常见…

linux 文件的权限

修改文件的权限 我这里有一个test.txt 文件&#xff0c;我们ll 查看一下该文件相应的属性信息 其中&#xff0c;权限的位置是相对固定的即&#xff1a; 第一个位置是r 权限&#xff0c;代表可读权限。 第二个位置是w权限&#xff0c;代表可修改权限。 第三个位置是x权限&…

【腾讯云 Cloud Studio 实战训练营】从零开始搭建一个数据大屏

文章目录 前言得到什么?使用Cloud Studio登录Cloud Studio登录方式Cloud Studio 功能介绍项目创建配置描述新建工作空间绑定Coding创建仓库绑定coding创建项目项目空间 项目搭建nuxt 脚手架Cloud Studio 安装插件nuxt初始项目预览问题描述 下载Datav 并体验页面结构展示 获取基…

【项目 线程2】3.5 线程的分离 3.6线程取消 3.7线程属性

3.5 线程的分离 #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());return NULL; }int main() {// 创建一个子线程pthread…

Vue3基础_响应式数据

setup是组合式API 选项式API&#xff0c;是data,methods,computed&#xff0c;watch等等全都是分开的&#xff0c;但是组合式API是把这些东西全都写在一起了。 1 vue2的缺点 (1)使用vue2 Vue2版本对数据的拦截用的是Object.defineProperty, 可以监测到对象的变化。因为o…

Spring源码篇(九)自动配置扫描class的原理

文章目录 前言ClassLoader如何加载jar包里的class自动配置扫描class的原理spring中的加载方式源码总结 前言 spring是怎样通过ComponentScan&#xff0c;或者自动配置扫描到了依赖包里class的&#xff1f; ClassLoader 这里涉及到了class Loader的机制&#xff0c;有些复杂&…

信必优行业服务能力-中国头部综合性证券公司

近期召开的国家高层会议提出 “要活跃资本市场&#xff0c;提振投资者信心”&#xff0c;明确了下一阶段资本市场发展新任务、新要求&#xff0c;资本市场有望呈现新气象、新风貌。各证券公司积极响应&#xff0c;全力推进资本市场回暖&#xff1b;同时各公司也借此东风修炼内功…

【科普知识】了解电机T型速度曲线和S型速度曲线的区别!

当电机从静止状态启动并加速到额定转速时&#xff0c;其速度变化并非线性的&#xff0c;而是呈现出不同的曲线特征。T型速度曲线和S型速度曲线是两种典型的电机加速曲线类型。那它们之间有什么区别呢&#xff1f;今天&#xff0c;就让我们来深入探讨电机加速曲线的奥秘。 电机速…

国内是不是很缺音视频的开发人员,想学习音视频开发

第一、音视频开发人员的培养是一个长期投入&#xff0c;见效慢的过程&#xff0c;不像有些培训机构&#xff0c;半年培训就可以出去找工作了。同时培训机构最终的目的是快速培训&#xff0c;推荐工作然后挣钱。而音视频开发见效太慢&#xff0c;没有一定时间的锻炼和项目喂养&a…

骨传导耳机什么牌子好?盘点最受欢迎的几款骨传导耳机

骨传导耳机最近一两年越来越受欢迎&#xff0c;市场上不同形态的非入耳式耳机都有&#xff0c;从骨传导&#xff0c;夹耳式到气传导等等都有。骨传导耳机的好处有很多&#xff0c;非入耳式&#xff0c;不伤耳朵&#xff0c;佩戴更舒适更安全。但是一直以来&#xff0c;骨传导耳…

如何把非1024的采样数放入aac编码器

一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求 我们知道aac每次接受的字节数是固定的&#xff0c;在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是&#xff1a; fdk_aac …

中规院:2023年黄河流域主要城市人居环境气象评估报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 黄河流域年均高温天数呈上升趋势&#xff0c;近五年达到历史高位。 黄河流域年均高温天数由1978年的11日升至2022年的17日&#xff0c;整体呈上升趋势。1978-2022年间&#xff0c;2018年年均高温天数…

AutoCAD项目外包开发流程

进行AutoCAD的二次开发&#xff0c;一般常用的开发工具是AutoCAD的官方开发工具--ObjectARX。这是一个面向对象的C的开发环境&#xff0c;通过ObjectARX&#xff0c;我们可以直接获取AutoCAD的内核级别的信息&#xff0c;可以大幅度的开发出高效的程序。今天和大家分享这方面的…

【Leetcode刷题】位运算

本篇文章为 LeetCode 位运算模块的刷题笔记&#xff0c;仅供参考。 位运算的常用性质如下&#xff1a; a ^ a 0 a ^ 0 a a ^ 0xFFFFFFFF ~a目录 一. 基本位运算Leetcode29.两数相除Leetcode89.格雷编码 二. 位运算的性质Leetcode136.只出现一次的数字Leetcode137.只出现一…