C语言中有符号整数的取值范围

C语言中有符号整数的取值范围,第1张

哎呀,查了一下,发现说错了刚才,罪过啊!!~~二进制的负数是用补码来表示的,就是反码+1,反码是把每一位(除符号位)都求反,即每位0、1互换,所得的数再加1。
0就是0000
0000
0000
0000,第一位相当于符号位,正数取0,负数取1。
0111
1111
1111
1111表示正2的15次方减一,第一位0表示正数。负2的15次方减一就是1000
0000
0000
0001,第一位1表示是负数。所以负2的15次方是1000
0000
0000
0000。大概是这么回事

有符号数的运算⽅法
⼀有符号数的加减法
1、符号数与⽆符号数的⼈为规定性:
⼀个数,是有符号数还是⽆符号数都是⼈为规定的。进⾏⼆进制运算时⽤⽆符号数或是补码运算时,结果都是正确的。
10000100+00001110
若规定为⽆符号数,即 132+146=146D 。
若规定为符号数,则为-124+14=-110,⽽[-110]补=10010010。解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码。机器中的有符号数的运算⼀般就是补码的运算。
2、补码加减法运算
计算机中,当确定为符号数运算时,符号数⼀律⽤补码表⽰,运算时符号位和数字位⼀起参加运算。同样,运算结果也⽤补码表⽰。
1)两符号数相加公式:
[X+Y]补 (MOD2)=[X]补+[Y]补 //MOD2即 mod 2^n,即丢弃符号位的进位(因为符号位参与运算是补码运算的特点)
2)两符号数相减公式:
[X-Y]补 (MOD2)= [X]补+[-Y]补
3例⼦:
求3CH-90H。
⾸先3CH=0011 1100,90H=1001 0000
(1)当为有符号数时,显然这两个数是某两个数的补码。(具体是哪两个数X Y, 需要⾃⼰计算)。运算结果也是补码,是X-Y的补码 [X-Y]补。机器只运算到这⼀步。[X-Y]补 就是运算结果,溢出 进位等标志位也都是这个补码运算过程的结果,由硬件ALU运算。X-Y并不是机器的运算结果,由[X-Y]补求X-Y是在计算机组成原理中由程序员或者编译器完成的⼯作,对于编译器来说运算结果才是X-Y,编译器属于软件,不属于硬件机器。
根据微机中有符号数(补码)的减法公式,[x]补(输⼊)-[Y]补(输⼊)=[x]补+[-Y]补(求补 *** 作结果)=[X-Y]补(微机运算结果) ,求[-Y]补是关键。
[x]补=0011 1100,[Y]补=1001 0000,
[-Y]补=[Y]补的 求补=0110 1111(取反)+1(加⼀)=0111 0000 //不是[Y]补的补码!!更不存在什么 -[Y]补 的补码(不存在-[Y]补这种写法)
解释求补 *** 作:
⽆论-[Y]补的符号位是0还是1。正数也可以有求补 *** 作,只是得到的数不叫补码,就是为了把减法转换成加法。求补 *** 作 就是取余(求补)(补码是⼈规定的,但是求补是数学定义)。证明[-Y]补=对-[Y]补 求补 *** 作:[0]补=[-x]补+[X]补 。[-x]补和[X]补不是正数和负数的关系!!⽽是互补关系,算数相反,不是逻辑相反。另外仔细想⼀下,我们学补码是为了什么?以前是为了求⼀个原码的补码是什么,因为计算机组成原理中 从编译器到微机 从微机到编译器 需要原码变成补码 补码变成原码,但是在微机原理中,就不需要这⼀部分了,⽽是需要求补 *** 作了。计算机组成原理中,是由y原码求出来的[-y]补,⽽微机原理中是 对[y]补 求反 *** 作出来的[-y]补,计算过程都不⼀样。计算机组成原理中的过程可以理解 但是不是微机真正的运算过程,这⼀次学习的微机原理的补码的加减法才是真的硬件的运算过程!
另外,补充⼀点,X=[X]补 的补码,由补码求原码时不⽤按照由原码求补码的逆过程(补码为1000 0000时例外!)。
《微机原理与接⼝技术》中写道:“由加法器的原理图,加法器的⽅式控制M⽤于控制加减法,当M=0时进⾏S=A+B *** 作,当M=1时进⾏S=A-B *** 作。当M=1(减法)时,各个异或门对B的各位进⾏求反,并将1作为初试进位加⼊结果,也就是执⾏对B的求反加1,即求补 *** 作。” 也就是说!⽆论B是有符号数还是⽆符号数,⽆论符号位是0还是1,只要M=1,就统统对B执⾏求补 *** 作所以,求补 *** 作可以对符号位是0的数执⾏!
所以,[X-Y]补=0011 1100-1001 0000=0011 1100+0111 0000=ACH
(2)补码最⼤好处就是不管是有符号数还是⽆符号数都可以⽤同⼀套加减法。系统对有符号数和⽆符号数的加减法都采⽤⼀样的策略。
⽆符号加减法不存在溢出问题,只是将进位或借位存储在CF中。
机器不知道你进⾏的运算是否有符号,如果你进⾏的是有符号运算,你需要查看OF,否则不需要。
所以,溢出不溢出,是由程序员判断的,机器不知道。
不管是有符号数还是⽆符号数,微机都是按补码运算,⾄于是进位还是溢出不仅要看进位标志位,还要看溢出标志位。
只不过在做⽆符号数运算时程序员不考虑溢出标志位,只考虑进位标志位⽽已。
⽐如0111+1101,你说它是⽆符号数7+13呢,还是有符号数7-3呢?
对微机⽽⾔这是⼀回事!
所以,微机中,⽆符号数时和有符号数时的运算结果⼀定是⼀样的。
(3)注意这道题和《计算机组成原理》学补码加减运算时的题⽬的区别。
例⼦:X=+0101,Y=-1010,求X-Y。
题⽬给的X Y,是原码, 所以已经默认是有符号数,也有判断是否溢出,所以默认的计算过程也是指机器运算过程。
原码在机器中 均是以补码保存和运算的,
[x]补-[Y]补=[x]补+[-Y]补=[X-Y]补,只⽤到了[x]补+[-Y]补=[X-Y]补
属于类型:已知X Y,所以先求[X]补, [-Y]补 ,便求得[X-Y]补。然后求X-Y。
也就是说,上⼀题已知的是[X]补 [Y]补,(机器的)运算结果是[X-Y]补。中间过程没必要求出X Y是什么数。
本题已知的是X Y,先得出机器的运算结果[X-Y]补,在做编译器的⼯作由[X-Y]补 求出X-Y。
⼆者求[-Y]补的⽅法不⼀样:前者是对[Y]补 求补 *** 作 求得的,后者是由-Y求得。
可以说,后⾯例⼦是编译器和微机共同⼯作的过程,前⾯例⼦只关系微机运算。

59
百度文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
有符号数的运算方法
有符号数的运算⽅法
⼀有符号数的加减法
1、符号数与⽆符号数的⼈为规定性:
⼀个数,是有符号数还是⽆符号数都是⼈为规定的。进⾏⼆进制运算时⽤⽆符号数或是补码运算时,结果都是正确的。
10000100+00001110
若规定为⽆符号数,即 132+146=146D 。
若规定为符号数,则为-124+14=-110,⽽[-110]补=10010010。解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码。机器中的有符号数的运算⼀般就是补码的运算。

最高位为符号位,0表示正,1表示负,而且有符号的,切16位的,除去一个最高位的符号位,剩下的数据位为15位,2的15次(有符号位)应表示为011 1111 1111 1111是这个有符号16位数能表示的最大值了。你再按这个求-2就可以了

你应该知道原码、补码和反码的意思吧,拿单字节来举例:
有符号的整数才有原码、反码和补码,其他的类型一概没有。对于一个字节的整数,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128~127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,272还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码

第一个char的最小值写错了 应该为 1111 1111
第二个说对了
就是最高位的意义问题 如果是带符号 最高位1为负数 0 为整数
如果不带符号的话 就全部是整数


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13138855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-10
下一篇 2023-06-10

发表评论

登录后才能评论

评论列表(0条)

保存