破败之王杀人戒bug原理剖析(从底层存储来解释)
今儿看到了破败之王的bug,一级团杀了人变成了对面,然后送塔,戒指就变成了很夸张的层数。
视频如下:
https://www.bilibili.com/video/BV1yr4y1A7Mo
一开始我也只是觉得好夸张啊,这什么玩意儿。但是看到杀人戒的层数,瞬间就大概明白怎么回事了。
下面粗略说一下思路,可能不对,但是原理应该差不多。
先看看戒指层数:

65534!学计算机的可能立马就会想到2的16次方,也就是65536。
众所周知,计算机中的数据都是用二进制表示的,杀人戒的层数肯定也是用的一个二进制的值表示的。而根据65534这个数字,基本可以断定这个值用的是16bit的内存来记录的。
如果是1层杀人戒,内存里存的就会是:
0000000000000001,16位,最后一位是1。
2层的呢,就是
0000000000000010。
这个二进制表示我就不多做赘述了,大家感兴趣的可以查一下。
这个视频里,是破败之王击杀了牛头,戒指本应该是+2的,但是却变成了65534,那么65534在内存中怎么表示的呢?
1111111111111110。
这时候就要引入另一个概念了,补码。前面所说的都是原码,是不能表达负数的。而表达负数,就要用补码了。这个具体原理这里也不引申了,就是一种 内存字节 ->实际值的表达方式。
65534用原码表示是1111111111111110,而1111111111111110这一坨二进制内存,如果用补码表示,它代表的值就是-2!
这个就是关键了!65534和-2在不同的编码方式中,所对应的二进制是一样的。
再想一下杀人戒的属性,杀人应该是+2的,但是此时破败之王变成了敌方单位,是不是这里的代码有bug,将+2就给算成了-2?
然后算戒指层数的时候,程序员用的是补码,-2就是1111111111111110。
而读取戒指层数时,另一个程序员却用了原码,1111111111111110就读取成了65534(原码和补码在表示比较小的正数时是完全一样的,所以正常情况下戒指层数也不会读错)。
这样就完全对的上了。。
溢出了的话不应该是65534,出现65534应该就是我描述的这样了,程序本身有bug,原码和补码也用混了。
破败之王杀人戒bug原理剖析(从底层存储来解释)的更多相关文章
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- 爬虫前篇 /https协议原理剖析
爬虫前篇 /https协议原理剖析 目录 爬虫前篇 /https协议原理剖析 1. http协议是不安全的 2. 使用对称秘钥进行数据加密 3. 动态对称秘钥和非对称秘钥 4. CA证书的应用 5. ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...
- ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行
ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行 核心框架 ASP.NET Core APP 创建与运行 总结 之前两篇文章简析.NET Core 以及与 .NET Framew ...
- 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】
原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...
- 【Xamarin 跨平台机制原理剖析】
原文:[Xamarin 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原 ...
- iPhone/Mac Objective-C内存管理教程和原理剖析
http://www.cocoachina.com/bbs/read.php?tid-15963.html 版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所 ...
- 【Xamain 跨平台机制原理剖析】
原文:[Xamain 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生 ...
- Python字符串原理剖析------万恶的+号
字符串原理剖析pyc文件,执行python代码时,如果导入了其他的.py文件,那么执行过程中会自动生成一个与其同名的.pyc文件,该文件就是python解释器变异之后产生的字节码 PS:代码经过编译可 ...
随机推荐
- scu-4445
Right turn frog is trapped in a maze. The maze is infinitely large and divided into grids. It also c ...
- Redis 集合统计(HyperLogLog)
统计功能是一类极为常见的需求,比如下面这个场景: 为了决定某个功能是否在下个迭代版本中保留,产品会要求统计页面在上新前后的 UV 作为决策依据. 简单来说就是统计一天内,某个页面的访问用户量,如果相同 ...
- Linux 驱动框架---驱动中的并发
并发指多个执行单元被同时.并行的执行,而并发执行的单元对共享资源的访问就容易导致竟态.并发产生的情况分为抢占和并行(多核)和硬抢占(中断).Linux为解决这一问题增加了一系列的接口来解决并发导致的竟 ...
- USB2.0协议学习笔记---基本概念
概念 USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...
- 将从摄像头即时读入的人像放入背景视频中_with_OpenCV_in_Python
import cv2 import numpy as np import time cap = cv2.VideoCapture(0) background_capture = cv2.VideoCa ...
- VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug
VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug bug jsconfig.json { // This file is required for VSCode to unde ...
- very useful English Acronyms in Programming for Programmer
very useful English Acronyms in Programming for Programmer alias / shorthand / acronyms 别名 / 简写 / 缩略 ...
- toString()[0]
toString()[0] https://prepack.io/ x = `A` //"A" x.toString()[0] //"A" x.toString ...
- js currying & js 科里化
js currying & js 科里化 var test = ( function (a){ console.log(`a2 =`, a);// 1 // console.log(`b2 = ...
- API protocols All In One
API protocols All In One SOAP vs. REST vs. JSON-RPC vs. gRPC vs. GraphQL vs. Thrift https://www.mert ...