首页 > 编程知识 正文

数据int的取值范围是多少,字节的取值范围

时间:2023-05-05 19:33:16 阅读:182397 作者:4354

首先我最近去接受了面试。 还可以的公司。 为什么这么说呢,因为公司在制作工具类软件,所以既有电脑方面,也有web方面、手机方面。 软件的用户数达到了3亿5000万人。 因为面向用户的主要是欧美,所以国内知道的人很少。 我在面试iOS的工作单位,在第一次的技术面试中问了我很多计算机基础的基础性问题。 其中一个给我留下了深刻的记忆。 为什么会这样呢? 他问我int在4字节时取的值范围是多少,所以他听了我的回答,一口咬定我一定是错的。 但是,那是电脑的常识性问题吧。 我从大学到现在六七年间,一直都很理解这个答案,但这次面试有人强烈主张我一定错了。 于是,面试结束回家后,我在网上和书上找了答案。 果然,我是对的,他是错的。 这给了我很大的感触。 在现在的工作中,应该有很多像他一样的人。 对一个知识的认识是错误的,还很可靠。 因此,我认为计算机知识一定要知道其中的原因。 否则,我觉得很可能真的持续了错误的认知好几年。

如果正文现在认为这个问题的答案不是这个,就需要仔细看看接下来要写的内容。 如果你知道现在这个答案,也不知道为什么会是这个值,请仔细看看我接下来写的东西。 如果你有已经知道的理由,请实际看看。 也许能得到更深的理解。

刚才介绍的4字节int缺省位于C/C语言中,缺省情况下也包含有符号的int或负数。

在说明这个问题之前,首先向大家说明一下知识。 众所周知,1字节为8位(1 byte==8 bit )。 为什么会有这样的东西呢? 理由很简单。 这是因为当前使用的计算机CPU和所有集成电路只能识别电信号。 从这些计算机硬件来看,电信号分为高电平、低电平、高电平为1,低电平为0两种。 因此,在CPU中,接收高低等级的硬件称为引脚。 是常说的金手指。 一个管脚可以接收一个0,1。 由于CPU内部的设计,每增加一个针脚,可显示的数值就会呈指数级增加。 也就是说,如果是16个的话,CPU的地址能力为2^16。 同样,32瓶是2^32。 到了这里,你终于知道我们常说的比特数是什么了吧。 是的,是CPU的针脚数。 (当然这不仅仅是CPU的位数,操作系统也同样有位数。 只有电脑的CPU和系统都是64位的时候,才能真正完全发挥64位的效果。

无符号此处详细说明无符号类型。 无符号类型的8位,也就是1字节时,可显示的数值个数是多少? 是的,是2^8。 但是,这也可以很好地解释。 1位时,可显示的数值为0和1,即2^1。 两位数时,可显示的数值为0、1、2和3,即2^2。 这样,8位可显示的数值个数为2^8。 我认为对此没有异议。而且,8位数可以显示的最大值是多少? 答案是2^8 - 1,也就是255。 这也可以同样解释。 对于1位,最大二进制数为1,即十进制数1,即2^1 - 1。 同样,对于2位,最大二进制数为11,即十进制数3,即2^2- 1。 您可能知道8位8位表示的最小值是8个0,也就是0。

由此情况计算,正好从0到2^8 - 1,各个数值唯一对应于对应的二进制值表示。 这里的意思是0正好对应0000,0000这个二进制数,255正好对应1111,1111这个二进制数。 这样,由于各数值与二进制表示唯一对应,所以各数值可以很好地协调存储。

有了符号,在面对没有符号的说明之后,就可以很好地说明有符号的情况了。

有符号就是有负数的意思。 为什么有负数的时候,就说有符号呢? 那么,我问个问题。 根据刚才的无符号说明,应该是相同的8位数值,相同的每1位只能识别0、1的CPU。 他到底要怎么样才能知道这二进制数是正是负呢? 前面的人也考虑了这个问题。 为了解决这个问题,提出了当有负数时,以最高有效位为符号位,符号位为1时,该数值为负数,符号位为0时,为正数的规定。 这就是符号出现的理由。

首先说明错误的答案,为什么8位的值范围是从-2^7到2^7- 1。 众所周知,有负数时,最高有效位是符号位。 这意味着,目前这8位中,实际可以存储值的位数只剩下7位。 也就是说,最大值为2^7 - 1加上符号位,就会从-2^7 - 1变为2^7 - 1。 大家看到这里觉得很有道理吗? 不是感觉不到错误吗? 如果你觉得这很合理,你现在的理解和面试我的人的想法一样。 也许这就是为什么他至今仍认为自己是对的。

其实,之所以会出现这样的错误认识,主要是因为自己没有认真考虑这个问题。 在这里,这样的理解有致命的问题。 那是0的表示。 如果为负0,则对应的二进制值为1000 0000;如果为正0,则对应的二进制值为0000 0000。 你能看到这里吗? 你看不见吗? 不管边缘看起来粗还是看不见,都可以说粗。 那就是粗糙度

不是觉得恍然大悟呢?

原码和补码

前人大神们为了解决这个问题,就想出了一个绝妙的方法,那就是补码。说到补码的话,就不得不提到的是原码和反码,为啥要说这两个东西呢,因为补码是通过原码和反码算出来的。前人们规定,原码就是那个数值直接算出来的二进制数,例如,1的原码就是,0000 0001,-1的原码就是,1000 0001。反码呢,就是,除符号位外,其他所有位取反,例如,-1的反码就是,1111 1110。我这里为啥不提1的反码呢,因为还有一条规定就是,正数的反码和补码都是他的原码,为啥这么规定呢,其实想想都知道原因很简单,那就是,本来正数的二进制数表示都是一一对应的,因此就没必要再大费周章了,当然,如果不这么规定的话,最终补码的形式也是不会一一对应一个二进制数的。

接下来就是补码了,反码算出来了,补码就很简单了,那就是反码加1,例如,-1的补码就是,1111 1110 + 1 = 1111 1111。这里提个注意点,就是,在计算补码的时候,最高位也是会参与计算的,也就是说,如果反码是1111 1111的话,补码 = 1111 1111 + 1 = 1 0000 0000,这里最高位1已经超出了八位,也就是常说的溢出了,那么就直接忽略了,也就是最终结果是0000 0000,大家猜猜这个补码的原码是誰?没错,就是负0,之后再看看正0,我们说过正数的原码、反码和补码都是原码,也就是0000 0000,看见没,这种情况下,正负0都是同一个二进制表示。这就已经很好的解决了0的问题。

冲突解决

这里就开始好好的跟大家说说这个取值范围。

首先,先说一一对应的事,大家已经知道了,当有负数存在的情况下,最高位是符号位,之后再根据原码、反码和补码的一系列规定和计算,有一点是可以确定的,那就是,负数和正数的二进制表示绝对不可能冲突,意思就是不会存在一个负数的二进制表示和某个正数的二进制表示是一样的,就是因为,负数补码的最高位永远是1,正数补码的最高位永远是0,能让负数补码最高位为0的情况,只有一种,那就是0的时候。为0时刚好就解决了正负数存储时正负0二进制表示不一致的问题,这也是补码的一个作用之一。之后就是正数的一一对应,之前也说过,正数情况下,补码就是原码,所以正数是肯定不可能存在正数之间的数值冲突的。最后再说负数,由于,原码时,每个二进制都是一一对应的(跟正数同理),那么负数的所有反码也都是肯定一一对应的,如果大家理解不了,可以自己试试用二进制看看,你会发现,无论是原码还是反码,每个数值的表示,肯定至少有一位跟其它任何数值都不一样,这就证明的唯一性。既然原码、反码都具有唯一性了,那么再加上一个1的话,仍然具有唯一性。

有符号8位的取值范围

费劲千辛万苦,终于来到了这里。首先,我们这里再回顾一下,就是,当存在符号位时,8位能表示的最大值就是111 1111,也就是7个1,也就是2^7 -1, 所以正数的范围就是0到2^7 - 1,负数就是-2^7 - 1 到-1,但是,这样算下来的话,总共表示的数值个数是2^7 + 2^7 - 1 = 2^8 -1,这可是比8位能存储的2^8这个数值少一个呢,这样不就活生生的浪费了一个麽?不知大伙有没注意到一个情况,那就是当为负数时,补码是1000 0000时,我们通过这个补码反向算得反码是0111 1111,原码就是0000 0000是不是感觉很诡异,这不是正0吗?xhdwk就是说,补码1000 0000这个二进制位压根不可能有,这就是刚说的存储二进制位中少的那个。但是呢,由于1000 0000本身代表的是128,再加上最高位为1,那么就是个负数,再加上所有的二进制表示又少了一个,因此,1000 0000就顺理成章的成了-128,当然,1000 0000是补码,它没有原码和反码。最后再加上一个计算机内部对负数的运算方式吧,就是对负数整体取绝对值,之后取反加1,算下来就是:-128(取绝对值) -> 128(变成二进制表示) ->1000 0000(取反)->0111 1111(加1) -> 1000 0000(补码)。-127(取绝对值)->127(变成二进制表示)->0111 1111(取反)->1000 0000(加1)->1000 0001(补码)。-126(取绝对值)->126(变成二进制表示)->0111 1110(取反)->1000 0001(加1)->1000 0010(补码)。你会发现,计算机内部对负数补码的运算的结果和我们之前说的运算结果是一毛一样的,从这里也就能清楚的看到,-128通过计算机内部运算之后的补码就是1000 0000

为何4个字节int取值范围是-2^31 到2^31 - 1

这里大伙应该就能清楚明白的知道为何4个字节int取值范围是-2^31 到2^31 - 1了吧。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。