【发布时间】:2017-04-06 16:58:04
【问题描述】:
我正在浏览一些 C++ 代码,发现如下内容:
(a + (b & 255)) & 255
双重AND惹恼了我,所以我想到了:
(a + b) & 255
(a 和 b 是 32 位无符号整数)
我很快写了一个测试脚本(JS)来证实我的理论:
for (var i = 0; i < 100; i++) {
var a = Math.ceil(Math.random() * 0xFFFF),
b = Math.ceil(Math.random() * 0xFFFF);
var expr1 = (a + (b & 255)) & 255,
expr2 = (a + b) & 255;
if (expr1 != expr2) {
console.log("Numbers " + a + " and " + b + " mismatch!");
break;
}
}
虽然脚本证实了我的假设(两个操作相等),但我仍然不相信它,因为 1) random 和 2) 我不是数学家,I have no idea what am I doing。
另外,对于 Lisp-y 标题感到抱歉。随意编辑它。
【问题讨论】:
-
那个脚本是什么语言的?
Math.random()是否在 [0,1) 上返回整数或双精度数?我不认为你的剧本(我能说的最好)反映了你提出的问题。 -
什么是c/c++代码?它们是不同的语言。
-
您无法重现您尝试在 JS 中测试的行为。这就是为什么在语言选择上每个人都只有你。 JS 不是强类型的,答案主要取决于 C/C++ 中变量的类型。考虑到您提出的问题,JS 完全是一派胡言。
-
@WeatherVane 这是基本的伪代码,使用 Javascript 函数名称。他的问题是关于
&和+在 C 和 C++ 中对无符号整数的行为。 -
请记住,“我编写了一个测试程序并得到了我对所有可能输入的预期答案”实际上并不能保证某些东西的行为符合您的预期。未定义的行为可能会像那样令人讨厌;只有在你说服自己你的代码是正确的之后才会给出意想不到的结果。