【C语言学习4——整型数据类型】

news2024/9/29 21:23:11

C语言学习4——整型数据类型

  • 整型数据类型
  • 用sizeof关键词来测量大小
  • 三位二进制表示的数值范围
  • 数值的补码表示法
  • 各种整型类型的数值范围是多少
  • 无符号整型

整型数据类型

在上一节当中,我们遇到了用int关键词(整数integer的缩写)来表示一个整数的数据类型。
这一节中,我们来详细讨论一下C语言里面的整数数据类型。
在这里插入图片描述
在C语言中,有上面表中列出的几种整型数据类型。
看到这里你可能想问,一个整数而已,为什么会需要定义这么多不同的类型出来呢?
计算机通过晶体管的开关状态来记录数据。它们通常8个编为一组,我们称之为字节。而晶体管有开关
两种状态,一个字节有8个晶体管,因此一个字节可以拥有2的八次方个不同的状态。让每一种状态对应
一个数值,这样一个字节可以表示256个不同数值。
在这里插入图片描述
要表示更大的数据范围就需要更多晶体管。要知道在发明C语言的年代,计算机存储资源是非常珍贵而
稀缺的。对存储资源,程序员可能恨不得把一块掰成两块来用。如果只想表达0到100以内的数值,那么
一个字节就足够了,何必用两个字节来存储呢?
而如今,即使存储资源已经较为丰富了,但是大部分的强类型语言,都延续了这个传统。它们均提供了
丰富的类型以供选用。而程序员在编写代码时,通常能预想到需要使用到的数据范围的大小。这样在处
理一个数据时,可以从语言所提供的类型中选用最合适的类型来承载数据。
那么接下来,你可能想知道这些类型中,它们分别占用几个字节,具体的数据范围是多少?从而合适地
选择数据类型。很遗憾,我不能准确地告诉大家。因为C语言标准并未规定这些数据类型的大小范围,
具体的实现交由了编译器和平台决定。那我们怎样知道在visual studio 2019中,各种整型数据类型能够
表示的数据范围呢?
我们需要sizeof关键词来帮我们测量。

用sizeof关键词来测量大小

和int一样,sizeof是C语言中的一个关键词。它是英文size of连起来的合成词。翻译成中文就是什么东西
的大小的意思。它能够测量C语言各种实体所占用的字节大小。
如果我们想看int所占用的字节大小,可以这样写sizeof(int)。执行后这段代码后,它的测量结果是一个
整型。我们可以借助printf函数将测量结果显示在控制台上。我们现在可以假设sizeof返回的结果是int类型的,在printf函数中使用占位符%d。而更准确的用法,应该用%zu。
测量int类型所占用的字节大小,并将结果打印在控制台上的代码如下:

printf("%d\n", sizeof(int));

sizeof后面既可以跟类型,也可以跟变量、常量。
1. 跟类型,测类型所占用字节的大小。
2. 跟变量,测变量的类型所占用字节大小。
3. 跟常量,测常量的类型所占用字节大小。

下面是以上三种情况的示例代码。

int a;
printf("sizeof int = %d\n", sizeof(int)); // 1.测类型所占用字节的大小
printf("sizeof a = %d\n", sizeof(a)); // 1.测变量的类型所占用字节大小
printf("sizeof 123 = %d\n", sizeof(123)); // 1.测常量的类型所占用字节大小

现在我们可以在自己的电脑上运行一下,看看C语言中提供的各种整型类型的大小。

printf("sizeof char=%d\n", sizeof(char));
printf("sizeof short=%d\n", sizeof(short));
printf("sizeof int=%d\n", sizeof(int));
printf("sizeof long=%d\n", sizeof(long));
printf("sizeof long long=%d\n", sizeof(long long));

在这里插入图片描述
运行一下,我们看到了结果。
char,short,int,long,long long分别占用了1,2,4,4,8个字节。至此,我们已经得知了它们所占
字节大小,并且验证了可以表示越大范围的数据类型所占用的字节越多。
值得注意的是在Visual Studio 2019中,int和long均占用4个字节。这并未违反C语言标准,C语言标准规
定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。
下面我们继续讨论一下,各种类型它们所能表达的数值范围具体是多少。

三位二进制表示的数值范围

TIPS:
如果暂时无法理解关于整型表达范围的原理分析,请先记住sizeof的使用和各种整型变量的表达范围的
结论即可。不理解整型表达范围的原理不影响对C语言的使用。

char,short,int,long,long long分别占用了1,2,4,4,8个字节。而每个字节由8个晶体管组成,
每个晶体管状态我们称之为位。那么char,short,int,long,long long分别占用了8,16,32,32,64
位。
太多的位不利于我们理解原理,我们暂时把问题简化一下,试试看位数减少到3。然后,分析3位的组
合,它能表示多大范围的数值呢?
在这里插入图片描述
三位二进制组成的数据类型,可以表达2的3次方也就是8个数值。如果从0开始,那么可以表达从0到7的
数据范围。那么我们可以得出以下结论:
如果不考虑负数,那么整型数据类型可以表达的数据范围是:
假设,位数为n,则数据范围从【0】开始,到【2的n次方-1】的数值范围。
对的,你肯定意识到了,负数怎么办?那我们需要拿出一个位来作为符号位。用来表示这个数据是正数
还是负数。在IEEE标准中,这个符号位存在于二进制的最高位。让我们用三位二进制来示范这种情况。
在这里插入图片描述
加上符号之后,现在取值范围变为负4到3了。红框中的为最高位,最高位为1的表示负数。你可能会觉
得有点奇怪,为什么3的二进制是011,而负3却是101呢?如果简单的加一个符号位,为什么不用111
呢?那我们看看如图中所示的3与负3相加的运算结果。
在这里插入图片描述
你会惊奇地发现,用101来表示负3与用011表示的正3相加。结果为1000,但是由于仅有3位二进制来保
存数据,最高位1被丢弃了。结果为000,居然得到了正确的结果0。为什么会这样呢?

数值的补码表示法

在这里插入图片描述
我们来观察上图的时钟,这个时钟是一个圆被分成了12个点,让我们假设这个时钟一步只能走一个整
。那么这个时钟只有12种不同的模式,我们把12称之为时钟的
现在指针指向了5点,我们要让指针回到0点。一个办法是直接回退5个小时(5-5)。
在这里插入图片描述
另一个办法是继续往前走7个小时(5+7)。
在这里插入图片描述
在第二种办法中,5+7=12,而12刚好为时钟的,时钟指向12的同时,也正好指向了0。
要让指针回到0点,只需要让它加上模与当前的时间的差即可。
因此,指针回退5小时与指针前进7小时是等价的。我们可以用指针前进来代替指针后退。
让我们将这种思想带入到上面讨论的三位二进制当中。三位二进制能表示8中不同的模式,因此它的
为8。要让3回到0,我们可以让3减去3,也可以让3加上模与3的差,即8-3=5。因此,我们可以把-3在三
位二进制中用5的二进制101表示。
这种将用加法来等效减法的二进制表示法被称之为补码表示法。
正数的补码就是其二进制本身。
而正数对应的负数的补码为:(模 - 正数)的二进制。
在这里插入图片描述
补码表示法既通过最高位,区别了正数和负数。并且,巧妙地应用了溢出,所得到的计算结果也是正确
的。类似于钟表仅需要向前走就可以实现减法,计算机的电路设计中,也只需要设计加法电路。极大地
简化了计算机内部电路的复杂程度。
求一个正数对应的负数的补码的第二种办法:
1. 先写出这个正数的二进制。
2. 从二进制的右边开始,遇到第一个1之前,全都填0。
3. 遇到第一个1之后,把1填下来。
4. 1之后的全部取反。

在这里插入图片描述

各种整型类型的数值范围是多少

终于可以回到最前面的问题了。各种整型变量的数值范围是多少?
在这里插入图片描述
次方数比位数少一,是因为最高位被用去做符号位了。

无符号整型

如果你确定你不会用到负数,那么请使用unsigned关键词。表明这个数据类型,是不带有符号位的。既
然不带有符号位了,那么原本留给符号位的那一个二进制位,可以用来表示数值。
在这里插入图片描述

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

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

相关文章

Python Qt5 入门教程

Python Qt5 入门教程 Python Qt5是一个强大的GUI工具包,可以用来设计各种桌面应用程序,包括图形用户界面、数据库应用程序等。本教程将带你入门Python Qt5,从安装开始到图形界面的设计以及常见的控件和事件。 安装 Python Qt5需要使用PyQt5…

好用的便签APP排行榜前十名?

我是一名时间管理与自律达人,而便签应用程序就是必备与理想的时间管理工具。经过自己长期的总结认为好用的电脑手机云便签APP应用程序应该具备以下功能。 1、多设备同步:可以方便地将电脑和手机之间的数据同步,随时随地管理便签内容。 2、分…

海思部署分类模型

1、原始模型 onnx转caffe报错没有globalaverage层。 于是转化成: onnx转化caffe之后,修改prototxt文件,加上globalaverage和reshape层. 参考:https://blog.csdn.net/z649431508/article/details/113425275 layer { name: “Glob…

PPO算法-理论篇

1. Policy Gradient 【李宏毅深度强化学习笔记】1、策略梯度方法(Policy Gradient) 李宏毅深度强化学习-B站 2. PPO PPO 算法 PPO算法更新过程如下: 初始化policy参数θ0\theta^0θ0在每一步迭代中: 使用θk\theta^kθk与环境…

架构师:不想当架构师的程序员不是好程序员

引言 不想当将军的士兵不是好士兵。 很多程序员的梦想,就是将来能成为一名架构师。 包括我刚学编程那时候,也是以当架构师为目标,觉得不想当架构师的程序员不是好程序员,希望将来能成为一个优秀的架构师。就像拿破仑那句名言&am…

进程调度算法(操作系统)

1、 前置知识 1.1 非抢占式与抢占式 1.1.1 非抢占式 非抢占式指的是一个线程的在执行期间,另一个线程的到达,尽管各项标准都优于执行线程(例如优先级高于当前执行线程),也不会抢占CPU资源,会耐心的等待该…

【matlab程序】海图坐标轴单位的唯一

【matlab程序】海图坐标轴单位的唯一 【matlab程序】海图坐标轴单位的唯一 本文写作来源,从实际出发,用于实际: 热带海洋学报,投稿须知: 其中一条关于海图制作规范中: 经度标识(E, W&#…

真题详解(0/1背包)-软件设计(四十九)

真题详解(线性表)-软件设计(四十八)https://blog.csdn.net/ke1ying/article/details/130119249 多态有四种类型: 参数多态:应用比较广泛的多态,称为最纯多态。 包含多态:最常见的就是子类型化。 过载多态&#xff1…

Nfinity: YouTube创作者如何通过SocialFi变现

Nfinity推出了一个具有革命性的SocialFi平台:该平台通过生成NFT来帮助YouTube创作者实现内容变现。 YouTube做为全球第一大视频内容平台,尽管通过付费会员和广告收入的分成,为创作者们提供了大量的盈利机会,但它也存在很多的局限性…

【MybatisPlus快速入门】—— 基础入门

入门篇 我们先简单回顾一下 Mybatis 的用法,再引出MybatisPlus 1.1 Mybatis 框架回顾 🌔 1、什么是Mybatis框架呢? 一个持久层框架,目的是简化持久层的开发我们就使用springboot整合Mybatis,实现Mybatis框架的搭建…

NBT - 生成式蛋白设计,AI带来的蛋白质工程飞跃

科学家们创建了一个能够从头合成人工酶的人工智能系统。实验测试发现,一些酶与自然界中发现的酶具有相同的功效,即使人工生成的氨基酸序列与任何已知的天然蛋白质明显不同。实验表明,尽管自然语言处理是为了阅读和编写语言文本而开发的&#…

蓝牙技术|安卓将支持超宽带语音,蓝牙通话更清晰

Android 的蓝牙通话即将迎来质的飞跃,超宽带语音技术将让你的声音更清晰、更真实。 Android 专家 Mishaal Rahman 发现,Android 开源项目仓库中最近添加了一个补丁,实现了与蓝牙免提配置文件 v1.9 相关的功能。据IT之家了解,这个…

【初识C++】(关键字,命名空间)

文章目录一、C中的关键字二、命名空间1.命名空间规则展开命名空间域 和 #include 的区别2.正确使用命名空间三、C中的输入和输出一、C中的关键字 二、命名空间 命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。…

window 和 linux 安装 Tesseract-OCR

一、 Window 安装 Tesseract-OCR 1.安装 tesseract-ocr-w64-setup-5.3.1.20230401.exe 下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 2. 配置 PATH 环境变量 3. 配置TESSDATA_PREFIX 环境变量 4. 在 cmd 中查询是否安装成功 5. 在安装的目录 tessda…

算法刷题总结 (七) 双指针

算法总结7 双指针一、双指针的概念1.1、什么是双指针?1.2、常见类型1.2.1、快慢指针1.2.2、左右端点指针1.2.3、区间指针 - 滑动窗口汇总二、经典例题2.1、快慢指针(1)、链表判环141. 环形链表142. 环形链表 II287. 寻找重复数876. 链表的中间…

人工智能学习07--pytorch15(前接pytorch10)--目标检测:FPN结构详解

FPN:用于目标检测的特征金字塔网络 backbone:骨干网络,例如cnn的一系列。(特征提取) (a)特征图像金字塔 检测不同尺寸目标。 首先将图片缩放到不同尺度,针对每个尺度图片都一次通过算法进行预测。 但是这样一来&#…

第二章:HTML CSS 网页开发基础(一)

一、HTML HTML&#xff1a;是一种网页制作标注性语言。HTML通过浏览器的翻译将页面呈现给用户。 1、1 HTML文档结构 HTML文档由4个主要标记组成&#xff0c;<html>、<head>、<title>、<body> <html>标记 该标记是所有html文件的开头&a…

[STM32F103C8T6]DMA

DMA(Direct Memory Access&#xff0c;直接存储器访问) 提供在外设与内存、存储器和存储器、外设 与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于 CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存的工作来说就无法使用。 我自己…

实验设备管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87682549 更多系统资源库…

构建新摩尔定律下的算力分发网络

摩尔定律最早由英特尔创始人之一戈登摩尔在1965年提出&#xff0c;他认为集成电路上可以容纳的晶体管数目在大约每经过18到24个月便会增加一倍。20年后的今天&#xff0c;面对日新月异的社会和突飞猛进的数字化需求&#xff0c;摩尔定律也随着社会的进步而被赋予了新的定义。Li…