排行榜 统计
  • 文章总数:649 篇
  • 评论总数:10704 条
  • 分类总数:4 个
  • 最后更新:4月4日
none

c语言设计计算器-【C语言-5】吃透C语言整型,快速计算取值范围!

本文阅读 13 分钟
首页 正文
本文最后更新于2022年11月09日,已超过907天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

您阅读这篇文章共耗时:

  1. 整型数据类型

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

  这一节中,我们来详细讨论一下C语言里面的整数数据类型。

  在C语言中,有上面表中列出的几种整型数据类型。

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

  计算机通过晶体管的开关状态来记录数据。它们通常8个编为一组,我们称之为字节。而晶体管有开关两种状态,一个字节有8个晶体管,因此一个字节可以拥有2的八次方个不同的状态。让每一种状态对应一个数值,这样一个字节可以表示256个不同数值。

  要表示更大的数据范围就需要更多晶体管。要知道在发明C语言的年代,计算机存储资源是非常珍贵而稀缺的。对存储资源,程序员可能恨不得把一块掰成两块来用。如果只想表达0到100以内的数值,那么一个字节就足够了,何必用两个字节来存储呢?

  而如今,即使存储资源已经较为丰富了,但是大部分的强类型语言,都延续了这个传统。它们均提供了丰富的类型以供选用。而程序员在编写代码时,通常能预想到需要使用到的数据范围的大小。这样在处理一个数据时,可以从语言所提供的类型中选用最合适的类型来承载数据。

  那么接下来,你可能想知道这些类型中,它们分别占用几个字节,具体的数据范围是多少?从而合适地选择数据类型。很遗憾,我不能准确地告诉大家。因为C语言标准并未规定这些数据类型的大小范围,具体的实现交由了编译器和平台决定。那我们怎样知道在visual studio 2019中,各种整型数据类型能够表示的数据范围呢?

  我们需要sizeof关键词来帮我们测量。

  2. 用sizeof关键词来测量大小

  和int一样,sizeof是C语言中的一个关键词。它是英文size of连起来的合成词。翻译成中文就是什么东西的大小的意思。它能够测量C语言各种实体所占用的字节大小。

  如果我们想看int所占用的字节大小c语言设计计算器,可以这样写sizeof(int)。执行后这段代码后,它的测量结果是一个整型。我们可以借助printf函数将测量结果显示在控制台上。由于sizeof返回的结果是整型的,所以printf函数中的占位符应使用%d。(更准确地说,应该用%zd。 )

  测量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.测变量的类型所占用字节大小

  现在我们可以在自己的电脑上运行一下,看看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));


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

  char,short,int,long,long long分别占用了1,2,4,4,8个字节。至此,我们已经得知了它们所占字节大小,并且验证了可以表示越大范围的数据类型所占用的字节越多。

  值得注意的是在Visual Studio 2019中,int和long均占用4个字节。这并未违反C语言标准,C语言标准规定高级别的类型取值范围不得小于低级别的类型,但是它们可以是一致的。

  下面我们继续讨论一下,各种类型它们所能表达的数值范围具体是多少。

  3. 三位二进制表示的数值范围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。为什么会这样呢?

  4.数值的补码表示法

  我们来观察上图的时钟,这个时钟是一个圆被分成了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表示。

  这种将用加法来等效减法的二进制表示法被称之为补码表示法。

  正数的补码就是其二进制本身。 而正数对应的负数的补码为:(模 - 正数)的二进制。

  补码表示法既通过最高位,区别了正数和负数。并且c语言设计计算器,巧妙地应用了溢出,所得到的计算结果结果也是正确的。类似于钟表仅需要向前走就可以实现减法,计算机的电路设计中,也只需要设计加法电路。极大地简化了计算机内部电路的复杂程度。

  求一个正数对应的负数的补码的第二种办法:

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

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

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

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

  6. 无符号整型

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

  7. char为什么叫字符型

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

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

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

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

  点击以下链接获取更多课程:

  01. 课程介绍

  02. VS开发环境的搭建

  03. 第一个C语言程序

  04. 基本的C语言语法知识

  05. 整型数据类型

  06. 浮点数据类型

  07. 变量与常量

  08. 字符常量及字符变量

  09. printf函数详细解析

  10. printf函数深入讨论

  11. scanf函数

  12. 运算符与表达式

  13. 类型转换

  14. 关系运算符与逻辑运算符

  15. 分支结构

  16. 循环结构

  17. 循环新关键词

  18. 多重选择

  19. 初识数组

  20. 多维数组

  21. 字符串与字符数组

  22. 输入输出缓存

  23. 函数

  24. 函数递归

  25. 调试代码

  26. 初识指针

  27. 指针运算

  28. 指针与数组

  29. 指针作为参数传递

  后续更多课程

本文来自投稿,不代表本站立场,如若转载,请注明出处:http://xuan.ddwoo.top/index.php/archives/174/
-- 展开阅读全文 --
ui平面设计师工资多少-【平面设计师有多少工资】
« 上一篇 11-09
ui平面设计师工资多少-平面设计师有多少工资
下一篇 » 11-09
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

发表评论

本站已加入互联网信息服务许可,请规范您的言行哦~

成为第一个评论的人

作者信息

热门文章

珍惜时间哦~

今日一言

- -
加载中...
换一句

标签TAG

热评文章