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

整型数据类型

1. 整型数据类型

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

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

b7130976fc971a986e0b9a38cb6eab67.png


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

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

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

2. 关键词及sizeof关键词

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

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

98ccb64a754b691ba2969940fa4aa572.png

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

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

printf

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

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

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

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

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

printf

46b68f3684195e6c653951fa681e5efc.png

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

  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个二进制。它能表示多大范围的数值呢?

0998df711946c263efa35ebb84a3f5ec.png

  请不要忘记给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。我们作对了吗?

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

d31e4771808e2fea47d3dcde772dd05b.png

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

581d265af3afa992fbe483564225a42e.png

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

214e7ff93e1b0718eabe9163e07cc649.png

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

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

d6e7c52c7650b62a79d763396b3a7ae4.png

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


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

7a4c0811797ebe7fd249a82df70e8c92.png

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

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

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

e81a59b3a5473c4e9cc551b40f69cb04.png

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

4. 无符号整型

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

0441692331d41ac31a4a97f1d068bc64.png

5. char为什么叫字符型

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

4f2784a30410c812080a1bba79007e9f.png

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

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

63ab1021f015d303b087febe137998b7.png

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

5dc2758f5fa5397b780e8c3a906b2b8b.png

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

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

603fe9d8971e1ec23bfbf2cc0b911ba3.png

9e53da4b8e808b9ff5aee9cdd29923e8.png

598980f137500ec3f42285bc2365f2a6.png

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

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

相关文章

Spring的两种动态代理:Jdk和Cglib 的区别和实现

Spring的两种动态代理:Jdk和Cglib 的区别和实现 一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件…

red6.4 mysql_rhel6.4 yum本地yum源配置

rhel6.4 yum本地yum源配置 在安装rpm包时,总是会碰到关联的包,在安装过程中带来很多麻烦,配置yum源,自关联包安装,简单省事。配置步骤:1:mount -o loop 挂载镜像盘2:编辑rhel…

python怎么判断输入的是不是数字_如何在PYTHON里判断字符串是否为数字

1 打开JUPYTER NOTEBOOK,新建一个空白的PY文档。2 str1 "888" print(str1.isdecimal()) print(str1.isdigit()) print(str1.isnumeric()) 这是正常的整数,三种方法都是可以判断。3 str2 "二" print(str2.isdecimal()) print(str2.…

在springBoot中使用Mapper类问题_@Mapper_@MapperScan_xml文件跟mapper分开_xml文件跟mapper在同一个目录下

文章目录背景xml文件跟mapper分开application.properties方式一: 主程序中MapperScan方式二: 每个接口添加Mapper注意点xml文件跟mapper在同一个目录下SpringBoot中关于Mapper 和 Repository 的一些疑问1. Mapper2. Repository3. MapperScan(“com.xxx.x…

上海交大python答案_上海交通大学python期末考试样题加解析

上海交通大学python期末考试样题加解析 一、选择题: 将唯一正确的选项写在题前括号中.每题2 分. 【 】(1) 本课程的目标定位是什么? [A] 学习Python 语言 [B] 学习计算机的工作原理 [C] 学习各种算法 [D] 学习用计算机解决问题 【 】(2) 下列哪个标识符是合法的? [A] var-nam…

hbase1.1.1 连接集群_Hadoop2.7.1+Hbase1.1.2集群环境搭建(10) hadoop hbase kerberos

1.hadoop安全机制历史在Hadoop1.0.0或者CDH3 版本之前, hadoop并不存在安全认证一说。默认集群内所有的节点都是可靠的,值得信赖的。用户与HDFS或者M/R进行交互时并不需要进行验证。导致存在恶意用户伪装成真正的用户或者服务器入侵到hadoop集群上&#…

SSM框架中mapper和mapping.xml文件在同一个包下需要的配置

前言 当我们在开发过程中,由于maven项目本身的限制,我们不能直接把我们的mapper.xml文件和对应mapper.java接口文件放到一起,也就是不能直接放在java包中,如图: 因为maven项目在构建打包时,会从src/main…

mysql配置文件简易代码_MySQL配置文件my.cnf 例子最详细翻译

转的MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用。#BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#TYPE: SYSTEM#END CONFIG INFO## 此mysql配置文件例子针对4G内存。# 主要使用INNODB#处理复杂队列并且连接数量较少的mysql服务器#…

Spring+Mybatis使用MapperScannerConfigurer简化配置__MapperScannerConfigurer的作用

SpringMybatis使用MapperScannerConfigurer简化配置 MyBatis的一大亮点就是可以不用DAO层的实现类,而我们知道service层调dao层 如果没有实现类,Spring如何为Service注入DAO的实例呢? 比如 现在有一个dao层的bookmapper和配置mybatis的xm…

python的property用法_在python中property怎样使用-百度经验

在python中property可以使类中的方法变为类中的属性一样来使用,使得类中的属性值不易暴露,更加安全,那么在python中property怎样使用呢?下面小编就带大家来看看详细的教程!工具/原料 python的版本:python 3…

Spring AOP 实现原理

什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构&…

java string类的方法_Java-String类的常用方法总结

一、String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间二、Str…

python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析 Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析】 来源:https://blog.csdn.net/qq_40705355/article/details/83856960七天天气来源:http://www.weather.com.cn/weather/…

Spring IOC原理总结

Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。 Bean缓存池&…

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题(普通用户sudo) gcc编译过程 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 链接(生成可执行文件或库文件&a…

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…

如何将一个向量投影到一个平面上_CameraLidar投影:2D3D导航

点击上方“AI小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达图1.图像上的激光雷达点激光雷达和照相机是用于感知和理解场景的两个基本传感器。他们建立周边环境模型、提供检测和确定其他对象位置的方法,从而为机器人提…

JAVA中和、||和|的区别?

问题一:JAVA中&&和&、||和|(短路与和逻辑与、短路或和逻辑或)的区别? 首先名称是不同的 逻辑运算符:&&逻辑与  ||逻辑或  它们都是逻辑运算符 位运算…

pppoe拨号的外网ip无法ping通_【思唯网络学院】 五大网络概念:IP地址、子网掩码、网关、DHCP服务和PPPoE拨号...

5G技术的更新,推动了新一代的网络通信发展,家庭宽带上网也从最初的十几K的速度,提升到了现在动则上百上千兆的速度,很多有部署了家庭NAS的用户,甚至都已经更新到了10G级别的内部局域网了。在这个信息互联的时代&#x…

MySQL数据库的数据类型以及取值范围详解

主要包括以下五大类: 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型:FLOAT、DOUBLE、DECIMAL 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDI…