我正在浏览一些C++代码,发现这样的东西:
(a + (b & 255)) & 255
Run Code Online (Sandbox Code Playgroud)
双重和我生气,所以我想到:
(a + b) & 255
Run Code Online (Sandbox Code Playgroud)
(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;
}
}Run Code Online (Sandbox Code Playgroud)
虽然剧本证实了我的假设(两个操作都是平等的),但我仍然不相信它,因为1) …
我有这种内存布局:
0018FBD2 ?? ?? ?? ?? ?? ?? ?? ??
0018FBDA AA AA AA AA BB BB BB BB <- stuff I'm interested in
0018FBE2 ?? ?? ?? ?? ?? ?? ?? ??
Run Code Online (Sandbox Code Playgroud)
在C中,我会这样做:
int* my_array = (int*) 0x18FBDA;
my_array[0]; // access
Run Code Online (Sandbox Code Playgroud)
但是,我正在使用C++,我想声明一个引用:
int (&my_array)[2] = (???) 0x18FBDA;
Run Code Online (Sandbox Code Playgroud)
为了这样使用:
my_array[0]; // access
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,我不知道如何施展它:
int (&my_array)[2] = (???) 0x18FBDA;
Run Code Online (Sandbox Code Playgroud)
我该怎么做?它甚至可能吗?