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

news2025/2/28 5:21:56

整数在内存中的存储

  • 我们知道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 1111
		1  :  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.coloradmin.cn/o/581723.html

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

相关文章

【笔记整理】常见聚类算法

【笔记整理】常见聚类算法 文章目录 【笔记整理】常见聚类算法一、均值偏移 - Mean-shift&#xff08;★★★★&#xff09;1、概述 & 图解&#xff08;“偏心”&#xff09;2、公式 & 步骤1&#xff09;基本公式&#xff08;“偏移量更新圆心”&#xff09;2&#xff…

chatgpt赋能python:Python两数相加代码:基础知识和实现方法

Python两数相加代码&#xff1a;基础知识和实现方法 简介 Python是一门高级编程语言&#xff0c;以其简洁、易读的语法和强大的库而被广泛应用于数据分析、机器学习、Web开发等领域。在这篇文章中&#xff0c;我们将介绍如何使用Python编写一个简单的两数相加代码&#xff0c…

约瑟夫环的线性解法

参考:https://www.luogu.com.cn/problem/P8671 参考:https://zhuanlan.zhihu.com/p/121159246 参考:https://blog.csdn.net/doge__/article/details/82429348 #include <bits/stdc.h> using namespace std; int n,k,s; int main(){cin>>n>>k;for(int i2;i&…

chatgpt赋能python:Python中的importmath

Python中的import math Python是一种高级编程语言&#xff0c;有众多强大的功能库可供使用。其中一个非常常用的功能库就是math。math库提供了许多用于进行数学运算的函数。在本文中&#xff0c;我们将介绍Python中的import math。 什么是import math&#xff1f; 在Python中…

chatgpt赋能python:Python中Decode函数详解:什么是Decode函数,它有什么作用?

Python中Decode函数详解&#xff1a;什么是Decode函数&#xff0c;它有什么作用&#xff1f; 介绍Decode函数 在Python编程中&#xff0c;我们经常需要处理文本数据。数据的处理可能涉及到不同的编码格式&#xff0c;比如ASCII、UTF-8、GBK等等。而Decode函数就是Python中用于…

安装并新建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粘贴到安装目…

chatgpt赋能python:Python中的Dash框架:数据可视化新选择

Python中的Dash框架&#xff1a;数据可视化新选择 随着大数据时代的到来&#xff0c;数据可视化成为日益重要的一环。Python早已成为数据科学家和工程师的首选语言之一&#xff0c;然而如何将数据转化为可视化图表呢&#xff1f;这时候&#xff0c;Dash框架应运而生。 什么是…

AHB-to-APB Bridge——08burst_test(rdy、nrdy、slverr、tight)、地址

-------------- burst_test:与single_test不同的是&#xff0c;需要在run_phase中使用fork join 让AHB侧和APB侧同时工作&#xff08;不能等AHB都发完APB才工作&#xff09;&#xff1b;num_apb_seq为APB已传输的个数&#xff0c;当APB侧传输数据的个数&#xff0c;大于或等于A…

dbn_svm电池容量soc预测,深度信念网络DBN+支持向量机SVM的电池容量SOC预测

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM长短期神经网络的原理 DBN+SVM的时间序列电容预测 基本结构 主要参数 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,本文用DBN提取特征,用SVM分类,…

chatgpt赋能python:Python中0.0和0的相同性探究

Python中0.0和0的相同性探究 Python是一种动态且解释型的编程语言&#xff0c;被广泛应用于编写Web应用程序、数据分析、人工智能等领域。当我们在Python中进行数值比较时&#xff0c;可能会遇到这样一个问题&#xff1a;0.0和0是否相同&#xff1f;本文将会进行探究&#xff…

【Python】一个简单的小程序,实现批量修改图片格式(附完整代码及程序)

程序下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ser7iEMRS54syvwl1cck1Q?pwdjr66 提取码&#xff1a;jr66 一、完整代码 如果想要测试代码&#xff0c;记得在使用前先保证已经安装了Python的PIL模块 import os from tkinter import Tk, Button, messa…

数据库基础——7.多表查询

这篇文章来讲一下数据库中的多表查询 目录 1. 一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解 1.3 案例分析与问题解决 2. 多表查询分类讲解 2.1 等值连接 vs 非等值连接 2.1.1等值连接 2.1.2 非等值连接 2.2 自连接 vs…

chatgpt赋能python:PythonDemo:快速了解Python编程语言

Python Demo&#xff1a;快速了解Python编程语言 如果你是一个对编程感兴趣的人&#xff0c;或者正在学习编程&#xff0c;那么你一定听说过Python这个编程语言。Python是一个非常易学易用的语言&#xff0c;同时也是非常流行的语言之一。Python具有众多的库和框架&#xff0c…

从RE到RSE:聊聊无线产品EMC认证测试中的辐射项(下)

当无线产品开启个人通信时代之际&#xff0c;EUT这个载体变了&#xff0c;辐射发射测试标准要不要变&#xff1f;怎么变&#xff1f; 回答这个问题的不再是ANSI和CISPR&#xff0c;而是联合国下属机构国际电信联盟无线电通信部门&#xff08;ITU-R&#xff09;以及著名的移动通…

Django学习笔记002之resetfull应用

学习目标&#xff1a; 学习resetfull接口 掌握Django web基础设施 学习内容&#xff1a; 1.学习resetfull接口 简介 人工智能解释&#xff1a; 应用场景 以下是人工智能使用Django框架实现的restfull接口代码&#xff1a; #views.py from django.http import JsonRespon…

maven环境变量配置zsh: command not found: mvn。

在输入命令vim ~/.zshrc的时候出现下面的报错&#xff1a; 解决办法 第一步输入下面的命令vim -r 文件名&#xff08;文件名也就是第二行双引号里面的所有字母字符&#xff09; 第二步输入下面的命令rm -f xx.swp 在配置好maven的环境变量但是在输入mvn -v的时候会报错 zsh:…

浅读《简约之美-软件设计之道》

浅读《简约之美-软件设计之道》 大家好&#xff0c;我是Lampard~ 这个周末阅读了一本程序设计相关的书籍《简约之美-软件设计之道》&#xff0c;它原著是《The Science of Software Development》&#xff0c;由余晟大大翻译。 这本书只有数十页&#xff0c;和它的命名一样追求…

Linux---GUN binutils

文章目录 一、GUN binutis概述二、工具集详细说明nm指令使用size指令使用objdump指令使用addr2line指令使用readelf指令使用strip指令使用 一、GUN binutis概述 什么是GUN binutis?它是一个二进制工具集&#xff0c;默认情况下所有 Linux 发行版中都会安装这些二进制工具。实际…

chatgpt赋能python:Python中的Cumsum()函数

Python中的Cumsum()函数 Python是数据科学家和工程师喜欢的一种高级脚本语言。它为许多数据科学的任务提供了大量的分析和可视化工具。 在Python中&#xff0c;Cumulative Sum或cumsum()函数是一个非常有用的函数之一。 它可以基于给定的轴计算数组元素的累积和。 什么是cums…

【牛客算法BM2】 链表内指定区间反转

​ 你好&#xff0c;欢迎来到我的博客&#xff01;作为一名程序员&#xff0c;我经常刷LeetCode题目来提升自己的编程能力。在我的博客里&#xff0c;我会分享一些我自己做过的题目和解题思路&#xff0c;希望能够帮助到大家。今天&#xff0c;我想和大家分享一道挑战性较高的题…