查看: 3227|回复: 72
打印 上一主题 下一主题

█►知识贴◄█对死后血量爆发上亿的解释

[复制链接]
跳转到指定楼层
楼主
发表于 2007-10-22 17:09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自:山东
大家好
先请大家看这个帖子:http://xyq.netease.com/viewthread.php?tid=429731&extra=&page=1
我是这个帖子的11楼 前2次回复中 我粗略解释了下这种现象的原因
今天 从2进制数字的角度 给出全面解释
(如果你很忙 看红字就够了)

一.理论是很强大的
首先我们学习下二进制数字的表示.
1.二进制数字是用0和1表示某个数字的一种方法.二进制是计算技术中广泛采用的一种数制。二进制数是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数也是采用位置计数法,其位权是以2为底的幂。比如,1的二进制是1 2的二进制是10 3的二进制是101...
具体请参考BAIDU以及计算机入门教材

2.随着计算机的发展 由于涉及到了负数 普通的二进制已经不能满足人们的需求 所以 现在计算机普遍使用的是补码
关于补码 下面给出网上的一段很好的解释:
在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。

已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。



二.具体问题具体分析
在原帖中 LZ血量为4294967280 (二进制为1111 1111 1111 11111111 1111 1111 0000 ) 而2的32次方,即32个1,表示的最大数字为4294967295(这里MH程序没有考虑首位符号位 4294967295=1111 1111 1111 1111 1111 1111 1111 1111)(这里 我们能猜测出 MH中 用32个二进制位来表示人物或者怪物等的血量 除了第一位是必须的表示正负的外 正常的话MH中理论上最大血量为2的31次方) 除去补码第一位表示正负 我们可以知道 LZ的血量这时应该是-15(1111 1111 1111 1111 1111 1111 1111 0000-1111 1111 1111 1111 1111 1111 1111 1111=0000 0000 0000 0000 0000 0000 0001 0000=-15)(以前帖子有误 说是-16)

正常的话 血量一旦为负 人物即死亡 这里问题出现了:人物死亡后 在人的思维中 HP=0
但在这里机器(MH服务器)它判定了人物死亡 但还是坚持着 这个人的血不是0 而是-15 而-15是如何用补码表示的呢 正是:1111 1111 1111 11111111 1111 1111 0000 (注意 这里红色的1 表示负号) 这样表示 也没什么不妥 只能说是这段程序有点不负责任 懂得编程的朋友应该知道 在这里 加个判定血量是否大与0的if语句即可了

if (血量<0)
{
死亡;
血量=0;
}
else
{
GOON...
}


但这里,MH服务器在继续了上面那个不大不小的错误的同时,犯了一个严重的错误:它没有把-15的补码先转换为原码 再转化为给玩家看的十进制数 而是直接把1111 1111 1111 11111111 1111 1111 0000 这样一个天文数字转换位了十进制数 于是 LZ的血 爆发了
(如果你很忙 看这段红字就够了)
三.写在最后
1.这个问题也许不是什么严重的BUG 但是却反映了一个游戏的品质 起码是内部程序的严谨性
2.这个问题对一般人来说 是很简单的 不要被庞大的数字吓倒
3.我分析出了在MH中 血量最大是2的31次方 我觉得 策划需要考虑下这个问题了 正常情况下 有人(即使是血鬼)能达到这个血量么? 2的20次方是1048576 100W的血 这个数量级已经足够了吧?希望能把节余的十几位资源省下来 为我们玩家多多做些实事
4.我不是WY的程序员 欢迎批评 指正 不要骂人 谢谢合作
觉得可以的 可以顶顶 或者给个分分

[ 本帖最后由 相思の笨笨 于 2007-10-22 18:19 编辑 ]

评分

参与人数 13人气 +40 收起 理由
wzg060123 + 2
tikki + 1
巧菲儿 + 1
sunhg1983 + 5
小づ佐 + 5
﹏绣気℡豬ミ + 5
天才没得说 + 5
黑糊糊黑黑糊 + 1
死士 + 5
【青龙】 + 3

查看全部评分

收藏收藏 分享淘帖 支持支持 反对反对 赞赞(0)
【论坛近期活动汇总】
回复

使用道具 举报

沙发
发表于 2007-10-22 17:11:10 | 只看该作者 来自:天津
- -基本没看懂
回复 支持 反对

使用道具 举报

3
发表于 2007-10-22 17:16:54 | 只看该作者 来自:辽宁
知识帖必须顶 然后必须给分
回复 支持 反对

使用道具 举报

4
发表于 2007-10-22 17:17:41 | 只看该作者 来自:北京
这个那个  那个这个....路过....
回复 支持 反对

使用道具 举报

5
发表于 2007-10-22 17:18:43 | 只看该作者 来自:广东
我学的那几年知识都丢完了.............现在看不懂了...............
回复 支持 反对

使用道具 举报

6
发表于 2007-10-22 17:19:46 | 只看该作者 来自:广西
楼主一定辛苦了
回复 支持 反对

使用道具 举报

7
发表于 2007-10-22 17:21:30 | 只看该作者 来自:辽宁
把知识换给老师  是我们小学毕业的唯一一点社会贡献
回复 支持 反对

使用道具 举报

8
发表于 2007-10-22 17:22:35 | 只看该作者 来自:江苏
懂了
回复 支持 反对

使用道具 举报

9
发表于 2007-10-22 17:22:47 | 只看该作者
辛苦了
回复 支持 反对

使用道具 举报

10
发表于 2007-10-22 17:23:11 | 只看该作者 来自:北京
根本就没看
回复 支持 反对

使用道具 举报

11
发表于 2007-10-22 17:23:18 | 只看该作者 来自:海南
忘了 都忘了
回复 支持 反对

使用道具 举报

12
发表于 2007-10-22 17:33:46 | 只看该作者 来自:广东
不错不错★很好
回复 支持 反对

使用道具 举报

13
 楼主| 发表于 2007-10-22 17:47:11 | 只看该作者 来自:山东
自己偷偷顶下~
回复 支持 反对

使用道具 举报

14
发表于 2007-10-22 17:48:54 | 只看该作者 来自:江苏
好多字
回复 支持 反对

使用道具 举报

15
发表于 2007-10-22 17:56:34 | 只看该作者 来自:河南
又学了点,顶起
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则