Rom*_*kov 9 .net c# 64-bit unsafe
现在提交Microsoft Connect ; 如果您觉得需要修理请立即投票.我也简化了测试用例:
byte* data = (byte*) 0x76543210;
uint offset = 0x80000000;
byte* wrong = data + offset;
byte* correct = data + (uint) 0x80000000;
// "wrong" is now 0xFFFFFFFFF6543210 (!)
// "correct" is 0xF6543210
Run Code Online (Sandbox Code Playgroud)
看看IL,就我所知,C#编译器做的一切都正确,错误在于JITter.
原始问题:这里发生了什么?
byte* data = (byte*)Marshal.AllocHGlobal(0x100);
uint uioffset = 0xFFFF0000;
byte* uiptr1 = data + uioffset;
byte* uiptr2 = data + (uint)0xFFFF0000;
ulong uloffset = 0xFFFF0000;
byte* ulptr1 = data + uloffset;
byte* ulptr2 = data + (ulong)0xFFFF0000;
Action<string, ulong> dumpValue =
(name, value) => Console.WriteLine("{0,8}: {1:x16}", name, value);
dumpValue("data", (ulong)data);
dumpValue("uiptr1", (ulong)uiptr1);
dumpValue("uiptr2", (ulong)uiptr2);
dumpValue("ulptr1", (ulong)ulptr1);
dumpValue("ulptr2", (ulong)ulptr2);
Run Code Online (Sandbox Code Playgroud)
此测试需要针对x64平台的64位操作系统.
输出:
data: 000000001c00a720 (original pointer)
uiptr1: 000000001bffa720 (pointer with a failed carry into the higher dword)
uiptr2: 000000011bffa720 (pointer with a correct carry into the higher dword)
ulptr1: 000000011bffa720 (pointer with a correct carry into the higher dword)
ulptr2: 000000011bffa720 (pointer with a correct carry into the higher dword)
^
look here
那么这是一个错误还是我搞砸了什么?
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |