Int范围的科学解释_第1页
Int范围的科学解释_第2页
Int范围的科学解释_第3页
Int范围的科学解释_第4页
全文预览已结束

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Int 范围的科学解释这得从二进制的原码说起:如果以最高位为符号位,二进制原码最大为 0111111111111111=2 的 15 次方减 1=32767 最小为 1111111111111111=-2 的 15 次方减 1=-32767此时 0 有两种表示方法,即正 0 和负 0:0000000000000000=1000000000000000=0所以,二进制原码表示时,范围是-32767-0和032767,因为有两个零的存在,所以不同的数值个数一共只有 2 的 16 次方减 1 个,比 16 位二进制能够提供的 2的 16 次方个编码少 1 个。 但是计算机中采用二进制补码存储数据,即

2、正数编码不变,从0000000000000000 到 0111111111111111依旧表示 0 到 32767,而负数需要把除符号位以后的部分取反加 1,即-32767 的补码为 1000000000000001。 到此,再来看原码的正 0 和负 0:0000000000000000 和 1000000000000000,补码表示中,前者的补码还 是 0000000000000000,后者经过非符号位取反加 1后,同样变成了 0000000000000000,也就是正 0和负 0 在补码系统中的编码是一样的。但是,我们知道, 16 位二进制数可以表示 2的 16次方个编码,而在补 码中零的

3、编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以, 人为规定 1000000000000000 这个补码编码为 -32768。所以,补码系统中,范围是 -23768 32767。因此,实际上,二进制的最小数确实是 1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的 1111111111111111 是二进制值的 -1。补码原码、反码、补码数值在计算机中表示形式为机器数,计算机只能识别 0 和 1,使用的是二进制 ,而在

4、日常生活中人们使用的是十进制 ,正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10 进制)的实践要比二或三进制计数出现的晚.(摘自 有空大家可以看看哦 ,很有意思的 ).为了能方便的与二进制转换,就使用了十六进制 (2 4)和八进制 (23). 下面进入正题 .数值有正负之分 ,计算机就用一个数的最高位存放符号 (0为正,1为负).这就是机器数的原码了 .假设机器能 处理的位数为8即字长为Ibyte,原码能表示数值的范围为(-127-0 +0127) 共 256 个.有了数值的表示方法就可以对数进行算

5、术运算 但是很快就发现用带符号位的原码进行乘除运算时结果 正确,而在加减运算的时候就出现了问题,如下 : 假设字长为 8bits ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10 (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码 .反码的取值空间和原码相同且一一对应 . 下面是反码的减法运算 :( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 )

6、10= ( 0 )10(00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题 .( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10(00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确问题出现在 (+0) 和 (-0)上 ,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中 ,包含有零号的印度数学和十进制计数对人类文明的贡献极大).于是就引入了补码概念 . 负数的补码就是对反码加一 ,而正数不变 ,正数的原码反码补码是一样的

7、.在补码 中用(-128)代替了 (-0),所以补码的表示范围为 :(-1280127)共 256 个.注意 :(-128)没有相对应的原码和反码 , (-128) = (10000000) 补码的加减运算如下 :( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10(00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 ) 10 = ( -1 )10(00000001) 补+ (11111110) 补= (11111111) 补 = ( -

8、1 ) 正确所以补码的设计目的是 :使符号位能与有效值部分一起参加运算,从而简化运算规则 .使减法运算转换为加法运算 ,进一步简化计算机中运算器的线路设计所有这些转换都是在计算机的最底层进行的, 而在我们使用的汇编、 C 等其他高级语言中使用的都是原 码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!有网友对此做了进一步的总结:本人大致总结一下:1、在计算机系统中,数值一律用补码来表示(存储)。主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用 补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。2、补码与原码的转换过程几乎是相同的。

9、数值的补码表示也分两种情况:(1正数的补码:与原码相同。例如,+9的补码是00001001。(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。例如,-7的补码:因为是负数,则符号位为“ 1整个为10000111 ;其余7位为-7的绝对值+7的原码0000111 按位取反为1111000;再加1,所以-7的补码是11111001。已知一个数的补码,求原码的操作分两种情况:(1) 如果补码的符号位为“0;表示是一个正数,所以补码就是该数的原码。(2) 如果补码的符号位为“1;表示是一个负数,求原码的操作可以是:符号位为1;其余各位取反,然后再整个数加1。例如,已知一个

10、补码为11111001,则原码是10000111 (-7):因为符号位为 “1;表示是一个负数,所以该位不变,仍为 “ 1;其余7位1111001取反后为0000110;再加1,所以是10000111。在 闲扯原码、反码、补码”文件中,没有提到一个很重要的概念 模”。我在这里稍微介绍一下 模”的概念:模”是指一个计量系统的计数范围 。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围, 即都存在一个 模”。例如:时钟的计量范围是 011;模=12。表示n位的计算机计量范围是 02(n)-1,模=2 ( n )。【注:n表示指数】模”实质上是计量器产生 溢出”的量,它的值在计量器上表示不

11、出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。例如:假设当前时针指向10点,而准确时间是 6点,调整时间可有以下两种拨法:种是倒拨4小时,即:10-4=6另一种是顺拨 8小时:10+8=12+6=6在以12模的系统中,加 8和减4效果是一样的,因此凡是减4运算,都可以用加 8来代替。对模”而言,8和4互为补数。实际上以12模的系统中,11和1; 10和2 ; 9和3 ; 7和5 ; 6和6都有这 个特性。共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8;所能表示的最大数是 11111111,若再加1称为100000000(9位),但

12、因只有8位;最高位1自然丢失。又回了 00000000,所以8位二进制系统的模 为2(8)。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码/关于算术运算的溢出问题,曾经我也迷茫过,而且不知道为什么整型变量溢出后会是模运算的结果呢, 以前还以为是不可以预测的,不过弄懂了原码、补码的概念后,就发现其实都是有规律可循的,如果你 还不太清楚补码什么东西,建议先看看随笔计算机中的原码、反码和补码,弄清楚整型数据在计算 机中是如何储存的。在那篇文中, 我们讲述了为什么我们把 -1 强制成无符号短整型输出后会得到65535 ,在这里我们不

13、对它进行类型转换,我们只是超出它的范围看看。还是定义一个 2 字节大小的短整型 short int n; ,学了前面的知识,我们知道这里 n 的范围是 -3276832767,而且通过前面知识我们也知道:这里的 -32768 在计算机中特殊表示为 10000000 00000000032767 是 00000000 0000000001111111 11111111-1-32767 是 11111111 1111111110000000 00000001当我们赋值n=32767,我们先n+1,超出它的范围,再输出 n看看,结果是-32768,为什么?我们来 分析一下, 32767 在内存中是以

14、 01111111 11111111 储存的,我们对这个二进制码加 1 运算看看,结果是 10000000 00000000,它表示的数是多少,哈哈,这不就是 -32768 吗?不甘心,也许是巧合呢,那我们再 加1看看,结果是 10000000 00000001,表示的是 -32767,再多试几个也一样的。哦,原来不是巧合呀, 正因为如此,所以我们就不用这么繁琐了,直接进行模运算就可以了!啊?什么是模运算?昏模运算就是除整取余的运算。面我把书上的例子再拿出来给你讲你就明白了。在16位机器上进行下面的操作: /为什么强调 16位机器?因为 1 6位机器上的 int 型的存储空间是 2个字 节int weight=42896;如果你把输出,在 1 6位机器中将不能得到 42896,而是-22640。因为有符号整数的表示范围是-3276832767(共 65536个数),所以它只能得到 42896的补码-2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论