算术移位 为什么会溢出啊~? 算术右移 是什么?

\u7b97\u672f\u79fb\u4f4d\u4e3a\u4ec0\u4e48\u4f1a\u6ea2\u51fa\uff1f

\u53d6\u4e00\u5b57\u8282\u4e3a\u4f8b\uff0c\u80fd\u8868\u793a\u7684\u6570\u5b57\u4ece -128 ~ 127

\u5148\u770b\u6b63\u6570\uff0c\u6bd4\u5982 9\uff0c\u5c31\u662f 0000 1001\uff0c\u6700\u9ad8\u4f4d\uff08\u7b26\u53f7\u4f4d\uff09\u548c\u6570\u636e\u6700\u9ad8\u4f4d\u90fd\u662f 0. \u5de6\u79fb\u5f97\u5230 0001 0010 \u4e5f\u5c31\u662f 18
\u518d\u770b\u8d1f\u6570 -9\uff0c\u5c31\u662f -(0000 1001) \u4e5f\u5c31\u662f 1111 0110 + 1 \u5373 1111 0111\uff0c\u6700\u9ad8\u4f4d\uff08\u7b26\u53f7\u4f4d\uff09\u548c\u6570\u636e\u6700\u9ad8\u4f4d\u90fd\u662f 1. \u5de6\u79fb\u540e\u662f 1110 1110\uff0c\u53cd\u8fc7\u6765\u662f (1110 1101 + 1)->0001 0010,\u5c31\u662f -18 \u4e86\u3002

\u5982\u679c\u6570\u636e\u6700\u9ad8\u4f4d\u548c\u7b26\u53f7\u4f4d\u4e0d\u540c\u7684\u8bdd\uff0c\u8bf4\u660e\u8fd9\u4e2a\u6570\u5b57\u7684\u7edd\u5bf9\u503c\u5df2\u7ecf\u8d85\u8fc7 64 \u4e86\uff0c\u90a3\u4e48\u5de6\u79fb\u4e00\u4f4d\u540e\u5fc5\u7136\u6ea2\u51fa\u3002
\u6240\u4ee5\u4e00\u4e2a\u3010\u6709\u6548\u7684\u3011\u5de6\u79fb\u6700\u9ad8\u4f4d\u548c\u6570\u636e\u6700\u9ad8\u4f4d\u5fc5\u7136\u4e00\u81f4\u3002\u6545\u7b97\u672f\u5de6\u79fb\u548c\u903b\u8f91\u5de6\u79fb\u4e00\u6837\u3002

\u7b97\u672f\u53f3\u79fb\u662f\u5c06\u5404\u4f4d\u4f9d\u6b21\u53f3\u79fb\u6307\u5b9a\u4f4d\u6570\uff0c\u7136\u540e\u5728\u5de6\u4fa7\u88650\uff0c\u7b97\u672f\u53f3\u79fb(SAR)\u662f\u5c06\u5404\u4f4d\u4f9d\u6b21\u53f3\u79fb\u6307\u5b9a\u4f4d\u6570\uff0c\u7136\u540e\u5728\u5de6\u4fa7\u7528\u539f\u7b26\u53f7\u4f4d\u8865\u9f50\u3002
\u6bd4\u5982\uff0c\u5728\u6c47\u7f16\u8bed\u8a00\u4e2d\uff0c\u5bf9\u4e8e\u7b97\u672f\u53f3\u79fb\uff0c\u5982\u679c\u6700\u9ad8\u4f4d\u4e3a1\uff0c\u5219\u88651\uff0c\u5426\u5219\u88650\uff0c \u5982\u5c0610000000\u7b97\u672f\u53f3\u79fb7\u4f4d\uff0c\u5e94\u8be5\u53d8\u621011111111\uff0c\u800c\u903b\u8f91\u53f3\u79fb7\u4f4d\uff0c\u5219\u4e0d\u8003\u8651\u7b26\u53f7\u4f4d\uff0c\u53d8\u4e3a00000001\uff0c\u8fd9\u70b9\u5c31\u662f\u7b97\u672f\u53f3\u79fb\u548c\u903b\u8f91\u53f3\u79fb\u7684\u533a\u522b\u3002
\u5728\u6c47\u7f16\u4e2d\uff0c\u53ef\u4ee5\u7528\u7b97\u672f\u53f3\u79fb\u6765\u8fdb\u884c\u6709\u7b26\u53f7\u6570\u636e\u7684\u9664\u6cd5\u3002\u628a\u4e00\u4e2a\u6570\u53f3\u79fbn\u4f4d\uff0c\u76f8\u5f53\u4e8e\u8be5\u6570\u9664\u4ee52\u7684n\u6b21\u65b9\u3002

\u6269\u5c55\u8d44\u6599\u7b97\u672f\u53f3\u79fb\u9700\u8981\u8003\u8651\u7b26\u53f7\u4f4d\uff0c\u53f3\u79fb\u4e00\u4f4d\uff0c\u82e5\u7b26\u53f7\u4f4d\u4e3a1\uff0c\u5c31\u5728\u5de6\u8fb9\u88651,\uff1b\u5426\u5219\uff0c\u5c31\u88650\u3002
\u6240\u4ee5\u7b97\u672f\u53f3\u79fb\u4e5f\u53ef\u4ee5\u8fdb\u884c\u6709\u7b26\u53f7\u4f4d\u7684\u9664\u6cd5\uff0c\u53f3\u79fb,n\u4f4d\u5c31\u7b49\u4e8e\u96642\u7684n\u6b21\u65b9\u3002

\u4f8b\u5982\uff0c8\u4f4d\u4e8c\u8fdb\u5236\u657011001101\u5206\u522b\u53f3\u79fb\u4e00\u4f4d\u3002
\u903b\u8f91\u53f3\u79fb\u5c31\u662f[0]1100110
\u7b97\u672f\u53f3\u79fb\u5c31\u662f[1]1100110
\u4e00\u3001\u5bf9\u4e8e\u6709\u7b26\u53f7\u6570 int
\u6b63\u6570\uff0c\u5de6\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u9ad8\u4f4d\uff0c\u5728\u4f4e\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76840\uff1b
\u6b63\u6570\uff0c\u53f3\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u4f4e\u4f4d\uff0c\u5728\u9ad8\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76840\uff1b
\u8d1f\u6570\uff0c\u5de6\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u9ad8\u4f4d\uff0c\u5728\u4f4e\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76840\uff1b
\u8d1f\u6570\uff0c\u53f3\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u4f4e\u4f4d\uff0c\u5728\u9ad8\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76841\uff1b

\u4e8c\u3001\u5bf9\u4e8e\u65e0\u7b26\u53f7\u6570 unsigned int
\u5de6\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u9ad8\u4f4d\uff0c\u5728\u4f4e\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76840\uff1b
\u53f3\u79fb\u76f4\u63a5\u4e22\u5f03\u6700\u4f4e\u4f4d\uff0c\u5728\u9ad8\u4f4d\u8865\u5bf9\u5e94\u4e2a\u6570\u76840\uff0c\u5373\u4f7f\u6700\u9ad8\u4f4d\u539f\u6765\u662f1\u3002

算术移位发生溢出的原因是:
因为C可以随便将任意类型按字节获取,比如INT16的-1,单字按二进制表示为 1111111111111111。如果是无符号65535 单字按二进制表示为 1111111111111111
在C看来Int32 和 UInt64 的按二进制看来也就是位数不同而已一个32位,一个64位,Int32 显示时候考虑下负数。但是在VB里面转换不是直接位COPY,还要校验数据。

溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了(别称肉鸡,也叫傀儡机)。溢出是程序设计者设计时的不足所带来的错误。

记一下吧。下面这是规律
算术位移右移不会产生溢出,但是算术左移时(设数据表示为X0 X1 ...Xn, X0是符号位,X1是最高有效位):
1).对于原码表示,算术左移时X1是1则溢出,是0则不溢出;
2).对于反码表示,算术左移时X1是0则溢出,是1则不溢出;
3).对于补码表示,算术左移时X0与X1异号则溢出,同号则不溢出

取一字节为例,能表示的数字从 -128 ~ 127

先看正数,比如 9,就是 0000 1001,最高位(符号位)和数据最高位都是 0. 左移得到 0001 0010 也就是 18
再看负数 -9,就是 -(0000 1001) 也就是 1111 0110 + 1 即 1111 0111,最高位(符号位)和数据最高位都是 1. 左移后是 1110 1110,反过来是 (1110 1101 + 1)->0001 0010,就是 -18 了。

如果数据最高位和符号位不同的话,说明这个数字的绝对值已经超过 64 了,那么左移一位后必然溢出。
所以一个【有效的】左移最高位和数据最高位必然一致。故算术左移和逻辑左移一样。

注意,算术左移和逻辑左移,都是:高位移出到 CF,低位补 0。

一般来说,左移一位,就相当于乘以 2。

乘以 2 之后,数据,必然就增加一倍。

如果数据过大,超出补码所能表示的范围,当然就会溢出。

----下面这句话,是无稽之谈----

为保证补码算术左移时不发生溢出,移位的数据最高有效位必须与符号位相同。

在不发生溢出的前提下,用硬件实现补码的算术左移时,直接将数据最高有效位移入符号位,不会改变机器数的符号。

--80x86 的左移指令,并没有上述功能--

移位的数据最高有效位必须与符号位相同?

--不是的,有可能改变符号位。

是说算术左移和逻辑左移的意义一样?

--是一样的,算术左移和逻辑左移指令,都没有保证符号位不变。

--只是在“算术右移和逻辑右移”指令中,才有所不同。



扩展阅读:定胆 几乎 准确率100% ... 最简单定下期和值方法 ... 移位怎么判断溢出 ... 补码左移溢出规则 ... 原码算术移位规则 ... 算术溢出错误怎么办 ... 角色迁移了关系还在吗 ... 算术移位如何判断溢出 ... 算术溢出错误怎么解决 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网