整型数据类型

1. 整型数据类型

  在上一节当中,我们遇到了整型(integer)int,用来表示一个整数的数据类型。

  下面呢我们来讨论一下C语言里面的整数数据类型。

  看到这里你可能想问,一个整数而已,为什么会需要定义这么多的类型出来呢?

  要知道在发明C语言的年代,计算机资源是非常珍贵的。对内存资源,就是恨不得把一块钱掰成两半用的那种感觉。能用小一点的来内存来存储,就不用大的。当然,现在大部分的强类型语言,都延续了这个传统。即使现在内存资源以及丰富了,程序员可以在编写代码时,可以预想到可能的数据大小。为什么不让程序员自行决定,用什么类型呢?

  接下来,你可能想知道这些类型中,具体的大小限制是多少。很遗憾,我不能100%准确的告诉大家。因为C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。那我们怎样知道在visual studio 2019中,各种整型变量的大小呢?我们需要sizeof关键词来帮我们测量。

2. 关键词及sizeof关键词

  和int一样,sizeof是C语言中的一个关键词。

  关键词是被编译器识别的,具有特殊意义的单词。在C语言标准中,关键词如下表所示。它们在C语言当中,都有具体的语法意义。例如int,代表一个整型数据类型,return代表函数结束并带回返回值。

带有*号的这些关键词是C99标准新增的,在C++中并未保留。

  关键词sizeof,其实是英文size of的意思,就是某某的大小的意思。如果我们想看int的大小,那么我就可以这样写sizeof(int)。被执行之后,会返回一个整型。我们可以用%d来占位,printf的用法请参照上一节。

printf

  sizeof后面既可以跟类型,也可以跟变量、常量。

1. 跟类型,测这个类型的大小。

2. 跟变量,测这个变量的类型的大小。

3. 跟常量,测这个常量类型的大小。

  我们可以在自己的电脑上运行一下,检查一下所有整型类型的size。

printf

  运行一下,我们看到了结果。

  char 为1 ,short 为 2, int 为 4, long 为 4, long long 为 8。什么int只能表示4?不是的,这个sizeof出来的大小是表示int所占的字节数为4。一个字节有8位二进制,那么4个字节就是32位二进制。那么32个二进制能表示多大的整数呢?

3. 各种整型类型的数值范围


TIPS:

  如果关于整型范围的分析暂时看不懂,请先记住sizeof的使用和各种整型变量的取值范围即可,不影响对C语言的使用。到时候回过头再来看取值范围的原理分析。


  我们先暂时不要讨论32个二进制,我们讨论一个稍微小一点的,3个二进制。它能表示多大范围的数值呢?

  请不要忘记给0位置了哦。那么32个二进制呢?

   2 x 2 x 2 x 2 x 2 ...(32个) x 2 x 2 = 2的32次方 = 4,294,967,296

   int的数值范围为:0 到 4,294,967,295。我们作对了吗?

  快了,但是不全对。我们来看下面这个代码。

  对的,你肯定意识到了,负数怎么办?那我们需要拿出一个位来表示符号。表示这个数据是正数还是负数。在IEEE标准中,这个符号位存在于二进制的最高位。同样的,我们来看三位二进制的情况。

  加上符号之后,现在取值范围变为-4到3了。红框中的为最高位,最高位为1的表示负数。你可能会觉得有点奇怪,为什么3的二进制是011,而-3却是101呢?如果简单的加一个符号位,为什么不用111呢?那我们看看3+(-3)的运算结果。

  可以看到,如果用上图中的101表示-3,那么3+(-3)的结果是正确的。和的结果为1000,但是我们只用3个二进制来表示数值。所以第四位被被抛弃了,也就是我们常说的溢出。但是,这个溢出却让我们得到了正确的结果000。而用111来表示-3,却无法得到正确的结果。

  让我们多算几个,你会发现仍然是正确的。

  你肯定很好奇,怎样求一个正数对应的负数的二进制表示呢?


  1. 先写出这个正数的二进制。
  2. 从二进制的右边开始,遇到第一个1之前,全都填0。
  3. 遇到第一个1之后,把1填下来。
  4. 1之后的全部取反。

  和上图的数据对照一下看看,确实是一致的。这种负数的表示法,既通过最高位,区别了正数和负数。并且,巧妙地应用了溢出,计算结果也是正确的。因此,既然能计算负数了,那么所有的减法,都能通过加一个负数来实现。这样,使得计算机电路得到了简化。这种表示负数的方法,被称为补码。一个正整数的补码是它本身,负数的补码,通过刚刚的步骤可以求得。

  最后,你肯定发现了整数4位,二进制为【100】,而负数4,在三位二进制表示中,也是【100】。这可咋办呢?既然最高位是符号位了,并且,负数4的运算结果也正确。我们上面已经算过关于-4的了。那我们就只能用【100】来表示-4了。因此,3位二进制可以表达的数值范围为【 +(2的二次方) ~ -(2的二次方 - 1) 】,也就是-4到+3。

  终于可以回到最前面的问题了。各种整型变量的数值范围是多少?

次方数比位数少一,是因为最高位被用去做符号位了。

4. 无符号整型

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

5. char为什么叫字符型

  由于计算机更改开始发展的时候,是由欧美的科学家和工程师进行开发的。它们暂时考虑到字符仅仅是拉丁字符,即26个字母加一些标点符号。并且把一个数值和字符做了一一对应关系。

  如图中,字符a为97,字符b为98。而char刚好可以装得下0到127,不浪费空间。所以一个字节的整型变量,被叫做了字符型。

  当你用整型转换符%d来打印97的时候,输出结果是97。   当你用字符转换符%c来打印97的时候,输出结果是a。

  如果你想表示一个字符,int虽然也可以,但是char更不占空间啊。

6. 怎样保证使用的整数在各个平台上范围统一

  由于不同平台的int算出来的sizeof可能不同,因此在数据范围特别敏感的情况下。请使用头文件stdint来定义你的变量类型。例如int32_t可以保证无论在上面平台上,都保证sizeof大小为32 / 8 = 4。

C语言中CY位什么时候才能为1_你真的了解C语言中的整型吗?相关推荐

  1. c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组

    C语言中普通整型变数在记忆体中占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中普通整型变数在记忆体中 ...

  2. 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体

    本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...

  3. c语言整形符号位_C语言中32位有符号整数如何定义

    展开全部 根据计算机系统.编译系统的不同,32位有符号整数的定义会略有差异,通常的做法32313133353236313431303231363533e59b9ee7ad943133343136363 ...

  4. C语言中7除以14的答案,2015年计算机二级《C语言》精选练习题及答案(14)

    1[简答题]规定输入的字符串中只包含字母和*号.编写函数fun,其功能是:删除字符串中所有的*号.编写函数时,不得使用c语言提供的字符串函数. 例如,字符串中的内容为"****A*BC*DE ...

  5. c语言中switch语句流程图_全国计算机二级知识点汇总(C语言等)

    点击蓝字 关注我们 全国计算机二级知识点汇总 算法的有穷性是指:算法程序的运行时间是有限的 算法的空间复杂度是指:算法在执行过程中所需要的临时工作单元数 算法的时间复杂度是指:算法在执行过程中所需要的 ...

  6. 在c语言中scanf什么时候用,scanf什么时候用??c语言?

    scanf函数原型折叠 int scanf( const char *format, ... ); scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息. 其调用格式为: sc ...

  7. C语言中while判断为0,在C语言中,为了结束由do-while语句构成的循环, while后一对圆括号中表达式的值应该能够为0()...

    品和标它列效指的所出企服务业产有绩,中为值这两个维度是,每个行打客对指标个维的两度进让顾分绩效,偏于图模型是型定性的诊断模一种研究四分. 票价团体另行在()公格.语言e语对圆括格及的价价格示门收费收费 ...

  8. c语言中为了结束由while,在C语言中,为了结束由while语句构成的循环,while后一对圆括号中表达式的值应该为()....

    线路8的速率是(,中为值国制光纤照美标准定的●按通信. 最多可以同时演奏出(,语言e语对圆括之间多台进行乐器连接通过方式,个通准的支持I标道●通用M音乐设备. 束由式模型C制号使全电用的颜色彩色式的视 ...

  9. 在c语言中i10是什么意思啊,2011年计算机二级考试C语言十套上机题

    2011年计算机二级考试C语言十套上机题 2011年计算机二级考试C语言十套上机题 1.填空题 请补充函数fun(),该函数的功能是:把从主函数中输入的字符串str2接在字符串str1的后面. 例如: ...

最新文章

  1. lisp协议instand_分享|Linux 上 10 个最好的 Markdown 编辑器
  2. /boor删除恢复,
  3. ODBC连接到400
  4. linux安装phpredis扩展
  5. vue中如何实现点击某个地方,让echarts生成的图表发生变化
  6. 【FTP】发布FTP服务器
  7. 20210122发文补充截图
  8. MySQL首次使用Windows_mysql的安装与使用(windows)
  9. 许可证编译器 (Lc.exe)
  10. 异步和同步http请求超时机制
  11. Python机器学习库sklearn几种分类算法建模可视化(实验)
  12. 松下plc安装序列号afpsgr7_松下fpwin gr7下载 Control FPWIN GR7(松下plc编程软件) v2.21 中文安装版(附序列号) 下载-脚本之家...
  13. 16种系统测试方法概念+测试要点
  14. 路由问题引起的怪异现象
  15. 从微盟员工删库跑路看程序员的职业素养。
  16. html5如何实现语音点歌,怎么给手机点歌 怎么样用自己手机给对方手机点歌
  17. JAVA学习总结-day1
  18. RxSwift核心逻辑
  19. 网易免费/付费163企业邮smtp服务器地址
  20. 如何在飞腾平台使用4G模块拨号上网

热门文章

  1. php 文字超出画布,input实现文字超出省略号(代码示例)
  2. 2020知道python语言应用答案_2020知到Python语言应用答案章节期末答案
  3. openresty—实现缓存前移
  4. struts2显示列表序号的办法
  5. 深度学习attention原理_深度学习Anchor Boxes原理与实战技术
  6. html5视差滚动效果,视差滚动效果
  7. mysql call procedure into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量...
  8. linux weblogic 内存溢出,weblogic 安装升级补丁出现内存溢出问题解决
  9. python爬取b站排行榜_实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列...
  10. html 360不识别,html 为什么在ie里显示正常在360浏览器不正常呢?