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

2024-05-01 15:44

本文主要是介绍int类型的取值范围(为什么负数比正数表示的范围多一位),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎁个人主页:我们的五年

🔍系列专栏: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类型。

这篇关于int类型的取值范围(为什么负数比正数表示的范围多一位)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/952059

相关文章

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用 1、强引用(Strong Reference)2、软引用(Soft Reference)3、弱引用(Weak Reference)4、虚引用(Phantom Reference)5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,除了我们常见的强引用(Strong Refer

Linux float int和16进制互相转换

Linux 上float int和16进制互换操作。之前把float转16进制,也就是转成4个字节,方便使用串口传输嘛。使用的方法是: //float 转 16进制float x_pid_p = 15.0;unsigned char * bValue = (unsigned char *)& x_pid_p;printf("%x\t%x\t%x\t%x\n", bValue[0], bVa

Flink SQL因类型错误导致MAX和MIN计算错误

背景 最近在做数据分析,用Flink SQL来做分析工具,因数据源的数据存在不太规范的数据格式,因此我需要通过SQL函数把我需要的数据值从VARCHAR类型的字段中把数据提取出来,然后再做MAX、MIN、SUM这些统计。怎料SUM算出来的结果准确无误,而MAX和MIN算出来的结果却始终不正确,最后发现原来是我用SQL函数提取VARCHAR类型的字段的数据,也是VARCHAR类型,所以导致MAX、

SQL求解两个时间差 时间类型 时间值

sql 求解两个时间差 SELECTDATEDIFF( Second, '2009-8-25 12:15:12', '2009-9-1 7:18:20') --返回相差秒数 SELECTDATEDIFF( Minute, '2009-9-1 6:15:12', '2009-9-1 7:18:20') --返回相差分钟数 SELECTDATEDIFF( Day, '2009-8