整型在内存中的存储,整型最大值最小值的推导,以及大小端的介绍

news/2025/2/6 4:07:59/

整数在内存中的存储

  • 我们知道C语言有以下基本的整型类型:

    char	//字符型
    short 	//短整型
    int		//整型
    long	//长整型
    long long 	//更长的整型
    
  • 我们可以用操作符sizeof和在<limits.h>头文件下,可以查看到各基本数据类型的所占字节的大小以及整形所能表示的范围

  • 注:

    • 由于char本质上是以ASCII码值存储,而ASCII是一个整数,故也将char归为整型

    • short 等价于 signed short,int 等价于 signed int,long 等价于 signed long,long long 等价于 signed long long,但是C语言标准没有明确规定char、signed char,unsigned char之间的关系,但一般来说,char与signed char等价

    • unsigned和signed的区别:signed的最高位为符号位。而unsigned的所有位都是数值位,所表示的数只能是非负数

    • 对于二进制、八进制、十六进制及其计算还不太了解的,建议看看二进制、八进制、十六进制与十进制的相互关系

数据类型占字节数整型表示的最大范围
char1-128~127
unsigned char10~2 * CHAR_MAX + 1
short2-32768~32767
unsigned short20~2 * SHRT_MAX + 1
int4-2147483648~2147483647
unsigned int40~2 * INT_MAX + 1
long4/8-2147483648~2147483647 / -9223372036854775808~9223372036854775807
unsigned long4/80~2 * INT_MAX + 1 / 0~2 * LLONG_MAX + 1
long long8-9223372036854775808~9223372036854775807
unsigned long long80~2 * LLONG_MAX + 1

原码,反码,补码

  • 计算机内部的二进制数都是以补码储存的

  • 正数的原码就是补码。

  • 反码即将原码的所有数取反,即1变0,0变1。

  • 负数原码(由十进制转二进制计算出来的数)与补码的关系:原码(保持符号位不变) -> 反码 -> 反码+1 -> 补码

  • 如将负数 1001 0111 变为补码:1001 0111 -> 1110 1000 -> 1110 1001

  • 举个例子:

    int num_1 = 10;
    /*
    在内存中存储的二进制序列为
    0000 0000 0000 0000 0000 0000 0000 1010
    */
    int num_2 = -10;
    /*
    在内存中存储的二进制序列为
    原码 :1000 0000 0000 0000 0000 0000 0000 1010
    反码 :1111 1111 1111 1111 1111 1111 1111 0101
    补码 :1111 1111 1111 1111 1111 1111 1111 0110
    */
    
  • 那为什么计算机中存储的是反码呢?

    • 使用补码可以将符号位和数值域统一处理

    • 同时也可以将加法和减法做统一处理(CPU只有加法器)

整数最大值最小值的推导

  • 了解了原码,反码,补码的概念后,我们就可以推导各整型的最大最小值了,这里我以char型为例:

  • signed char有符号字符型,最高位为符号位

    • 由于正数的补码就是原码,最大值很容易得到,即:0111 1111 = 127

    • 而对于最小值,可能有很多小伙伴会疑惑最小值为什么是-128而不是-127,这里我们来讨论一下:

    • 我们可以发现char类型中,-128的原码和补码都是1000 0000,同时,这也是-0的原码,但-0和0表示的是同一个数,因此**-0就是没有意义的**,那么1000 0000这个数怎么办,为了避免浪费,我们就将它顺延到后面去,因此char的最小值,就是-127-1 = -128

  • 其他整数类型也是同样的推导。

相关例题

  • 注:建议先了解整型提升的相关知识,这样理解会更加深刻。

Eg1

#include<stdio.h>
int main()
{char num_1 = 127 + 1;/*整型提升:127:  0000 0000 0000 0000 0000 0000 0111 11111  :  0000 0000 0000 0000 0000 0000 0000 0001和 :  0000 0000 0000 0000 0000 0000 1000 0000由于截断num_1:1000 0000 = -128*/printf("num_1 = %d\n", num_1);/*num_1:1000 0000整型提升:1111 1111 1111 1111 1111 1111 1000 0000反码:    1111 1111 1111 1111 1111 1111 0111 1111原码:    1000 0000 0000 0000 0000 0000 1000 0000因此num_1 = -128*/char num_2 = -128 - 1;/*整型提升:-128:1111 1111 1111 1111 1111 1111 1000 0000-1:  1111 1111 1111 1111 1111 1111 1111 1111和:1 1111 1111 1111 1111 1111 1111 0111 1111由于截断num_2:0111 1111 = 127*/printf("num_2 = %d\n", num_2);return 0;
}

在这里插入图片描述

  • 通过这一题,我们可以发现,char类型的数据其实可以构成这样的循环:

    在这里插入图片描述

Eg2

int main()
{char a[1000] = {0};int i=0;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0;
}
  • 我们知道strlen碰到字符‘\0’就会停止读取,而‘\0’的ASCII值为0,因此这一题,我们就是要看当i为多少时,a[i] == 0
  • 由上面的循环图,我们知道,a[i]应该依次被赋值为 -1,-2,-3……-128,127,126……0
  • 因此strlen(a) = 128 + 127 = 255

大小端的介绍

  • 首先我们要知道,整数在内存中有两种存储形式:大端字节序存储和小端字节序存储

    • 字节序:是以字节为单位,讨论存储顺序的

    • 大端字节序存储:把一个数据的低位字节的内容,从放在高地址处,一个数据的高位字节的内容,存放在低地址处

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wtCSgxG-1685285880695)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230527173833546.png)]

    • 小端字节序存储:把一个数据的低位字节的内容,从放在低地址处,一个数据的高位字节的内容,存放在高地址处
      在这里插入图片描述

  • 例如对于如下代码

    #include<stdio.h>
    int main()
    {int num = 0x11223344;return 0;
    }
    
  • 我们在内存中可以看到num的存储形式:

    在这里插入图片描述

    在这里插入图片描述

    可以看到,这是以大小端字节序存储的(左边是低地址,右边是高地址)


http://www.ppmy.cn/news/100535.html

相关文章

Kubernetes_核心组件_kubelet_kubelet服务全解析

文章目录 前言一、查看kubelet当前运行1.1 查看kubelet当前运行1.2 kubelet配置文件1.3 kubelet启动参数文件1.4 kubelet启动全过程 (自定义启动参数文件) 二、kubelet启动过程2.1 kubelet启动过程2.2 自定义kubelet所有文件并运行步骤1&#xff1a;新建静态token文件和user&am…

在 Git 中撤消更改的 6 种方法!

目录 1. 修改最近的提交 2. 将分支重置为较旧的提交 硬重置 软重置分支 创建备份分支 3. 交互式变基 删除旧提交 改写提交消息 编辑旧提交 压缩 4. 还原提交 5. 签出文件 6. 使用 Git Reflog 当使用 Git 进行项目代码管理时&#xff0c;难免会出现一些错误操作或需…

list常见接口的使用(基于c++标准库中的STL)

前言 list是重要的容器了解它的常见接口以及使用是很有必要的&#xff0c;为什么有了vector还要有list呢&#xff1f;因为vector存在一些缺陷&#xff0c;比如&#xff1a;容量满了要扩容&#xff0c;扩容是要付出代价的&#xff08;性能的损失&#xff09;&#xff0c;存在空…

任务7 课程信息管理系统

系列文章 任务7 课程信息管理系统 已知课程的信息包括&#xff1a;课程编号&#xff0c;课程名称&#xff0c;课程性质&#xff08;必修、选修&#xff09;&#xff0c;课时&#xff0c;学分&#xff0c;考核方式&#xff08;考试、考查课&#xff09;&#xff0c;开课学期&a…

DIP:依赖反转原则

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 DIP&#xff1a;依赖反转原则 系列文章目录1、依赖反转原则的定义和解读2、稳定的抽象层3、依赖倒置原则和控制反转、依赖注入的联系小结 1、依赖反转原则的定义和解读 SOIL…

11、渗透性测试及验收测试

目录 什么是安全测试 安全测试与常规测试的区别 SQL注入漏洞 SQL注入漏洞会带来以下几种常见的后果&#xff1a; SQL注入漏洞攻击流程 注入点类型 SQL注入的防范措施 XSS跨站脚本漏洞 XSS原理解析 XSS类型 1、反射型XSS 2、存储型XSS 3、存储型XSS 查找XSS漏洞的…

安装并新建windows下wxwroks7.0 bootrom工程

双击steup.exe 直接next 直接next 选择typical&#xff0c;然后next I accept 安装完成finish 现在双击Workbench 4&#xff0c;新建vxworks7.0工程&#xff0c;会出现下面的情况&#xff0c;因为没有licence 安装licence&#xff0c;将zwrsLicense-vx7-perm.lic粘贴到安装目…

WookTeam是一款轻量级的开源在线团队协作工具

产品介绍 English Documentation wookteam 是一款轻量级的在线团队协作工具&#xff0c;提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发&#xff0c;知识库管理等工具。wookteam 支持团队在线聊天沟通&#xff0c;订阅任务动态实时推送。wookteam 全部开源…