int类型的取值范围(为什么负数比正数表示的范围多一位)

server/2024/9/24 11:02:52/

🎁个人主页:我们的五年

🔍系列专栏:C语言基本概念

🌷追光的人,终会万丈光芒

 

目录

 🏝1.int的基本概念:

空间大小:

有符号类型的表示形式:

 🏝2.原码、反码、补码

 🏝3.观察+0和-0:

 🏝4.注意:


 前言:

还记得那个刚刚学习C语言,老师给我们讲课的时候,我就稍微了解一下为什么int类型的数据,负数可以表示到-2³¹,而正数只能表示到2³¹-1。

现在也是有时间让我好好写篇文章研究研究它的来龙去脉。

 🏝1.int的基本概念:

空间大小:

●int表示的有符号的整形,int占用4个字节。一个字节是八个比特位,也就是int占用32个比特位,数据在计算机里面存储都是以二进制的形式存储的,并且是以二进制的补码进行存储。

以二进制的原码进行打印。

有符号类型的表示形式:

●有符号的类型,用第一位来表示符号位,1代表负数,0代表正数,其他31位就是用,表示数值,比特位只能放1和0。

1的二进制表示形式:0000  0000 | 0000  0000 | 0000  0000 | 0000  0001

-1的二进制表示形式: 1000  0000 | 0000  0000 | 0000  0000 | 0000  0001

所以当出符号位以外,其他的都存1时,可以表示最大的数。

即正数最大为:

0111  1111 | 1111  1111 | 1111  1111 | 1111  1111=2³¹-1=2147483647

当符号为1时,此时为表示为-2³¹+1=-2147483647

此时我们看,如果这样来看,好像int只能表示-2³¹+1~2³¹-1呀,为什么还能表示到-2³¹呢?

 🏝2.原码、反码、补码

我们输入的数,一开始是原码,要变成补码以后,才能存储的计算机中,打印的是原码。

正数的原码、反码、补码都相同。

负数从原码反码是符号位不变,其他的取反,这里的取反就是,0变成1,1变成0,因为二进制里面只有0和1.

负数从反码补码:直接+1

-1的原码:1000  0000 | 0000  0000 | 0000  0000 | 0000  0001

-1的反码:1111  1111   | 1111  1111  | 1111  1111   | 1111  1110

-1的补码:1111  1111   | 1111  1111  | 1111  1111   | 1111  1111

-1补码的16进制形式:ff ff ff ff

 观察下面代码输出的值为多少?

#include<stdio.h>
int main()
{int a = 0X80000000;int b = 0X80000001;int c = 0Xffffffff;printf("%d\n%d\n%d\n", a, b, c);return 0;
}

对于上面的这个,我的理解是,如果采用0X进行赋值,那么就直接在计算机以这种形式保存下来,因为保存的是补码,负数要转为原码以后,才能打印。

当补码为-0的时候,原码表示为-2³¹。

当补码为-1的时候,原码表示为-2³¹+1。

当补码为1111  1111 | 1111  1111 | 1111  1111 | 1111  1111,原码为-1.

 🏝3.观察+0和-0:

+0:0000  0000 | 0000  0000 | 0000  0000 | 0000  0000

-0:1000  0000 | 0000  0000 | 0000  0000 | 0000  0000

+0和-0,都是表示0,那么我们就没有必要用两个数共同来表示0,我们用+0表示0,用-0取表示其他的数,上面我们也发现,-0其实表示的是-2³¹,所以这也是一种规定,可以让我们对资源有一个更充分的利用。

 🏝4.注意:

我们来看一下这个东西:

#include<stdio.h>
int main()
{int a = -2147483648;a = -a;printf("%d\n", a);return 0;
}

这里的a就是-2³¹,我们可以直接把它转为正数,然后打印出来吗?

答案是不可以的,因为如果转为正数,放到int里面,int类型是存不下的,int只能存2³¹-1。所以要这么做的话,我们是能把它存到long 类型,或者long long类型。


http://www.ppmy.cn/server/32098.html

相关文章

【Linux】进程等待

思维导图 学习目标 进程等待的必要性进程等待的方法wait函数和waitpid函数的学习参数status的介绍 一、进程等待的必要性 1.1 进程等待是什么&#xff1f; 任何子进程&#xff0c;在退出的情况下&#xff0c;一般都必须让父进程进行等到&#xff0c;进程在退出的时候&#x…

使用RTSP将笔记本摄像头的视频流推到开发板

一、在Windows端安装ffmpeg 1. 下载ffmpeg:下载ffmpeg 解压ffmpeg-master-latest-win64-gpl.zip bin 目录下是 dll 动态库 , 以及 可执行文件 ;将 3 33 个可执行文件拷贝到 " C:\Windows " 目录下 ,将所有的 " .dll " 动态库拷贝到 " C:\Windows\Sy…

001 springCloudAlibaba 负载均衡

文章目录 orderServerOrderController.javaProductClient.javaOrderServerApplication.javaServletInitializer.javaapplication.yamlpom.xml productServerProductController.javaProduct.javaProductServerApplication.javaServletInitializer.javaapplication.yamlpom.xml p…

Vue 项目 尚品汇(一)

一、开发环境构造 Vue-cli 脚手架初始化项目 node 平台 和 webpack 和 淘宝镜像 环境 &#xff08;一&#xff09;脚手架 1.安装脚手架 在我们的项目文件夹中路径输入 cmd 然后在终端中输入 vue create app(项目名) 选择 vue 2 然后安装 &#xff08;因为是基于 vue2 开…

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式&#xff0c;它提供了许多强大的功能&#xff0c;特别适合汽车行业的企业使用。 3D看车可实现哪些功能&#xff1f; 1、细节展示&#xff1a; 51建模网提供全套汽车行业3D数字化解决方案&#xff0c;3D看车能够将汽车展示得更加栩栩如生&…

Android 11 12 13耳机图标不显示问题解决方案以及整个图标显示流程

目录 1.解决方案 2.原理分析 ①.config.xml配置文件 ②.StatusBarIconControllerImpl ③.StatusBarIconView类

Docker私有镜像仓库搭建 带图形化界面的

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址&#xff1a;https://hub.docker.com/_/registry 先配置私服的信任地址: # 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容&#xff1a; "insecure-registries":["http://192.…

论文笔记(四十五)Attention Is All You Need

Attention Is All You Need 文章概括摘要1. 介绍2. 背景3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 按比例点积Attention3.2.2 Multi-Head Attention3.2.3 注意力在模型中的应用 3.3 定位前馈网络3.4 嵌入与 Softmax3.5 位置编码 4 为什么 Self-Attention5. Trainin…