当无符号字符被视为数组时,C++如何查看指针?
How does C++ look at a pointer to an unsigned char when it's treated like an array?
我试图破译一些代码,它似乎是处理顺序内存地址的值从我预期的向后。一个64位有符号整数被转换为一个8位无符号字符,下面是它的简化版本:
unsigned char* ucMyChar;
unsigned __int64 ui64MyInt;
CString strMyString;
//some code that assigns a value to ui64MyInt
ucMyChar = (unsigned char*)&ui64MyInt;
strMyString.Format("%02x%02x%02x%02x-%02x%02x-1%01x%02x",
ucMyChar[3], ucMyChar[2], ucMyChar[1], ucMyChar[0],
ucMyChar[5], ucMyChar[4], ucMyChar[7], ucMyChar[6]);
如果ui64MyInt
的值为:
0x010203040a0b0c0d
下面哪个是正确格式化的字符串?
04030201-0b0a-1d0c
或
0a0b0c0d-0304-1102
我问的原因是因为我有一个值,我试图在这段代码中反向运行数学,因为一些所需的信息包含在用于生成此字符串的原始值中,并且由于文件损坏,没有其他方法可以恢复所述信息。到目前为止,我使用第一个字符串提出的值似乎超出了预期范围,我不确定我是否犯了数学错误,或者如果我不理解unsigned char指针的工作方式。
这是实现定义的,整数的位在内存中的存储顺序。(这意味着编译器可以决定,并且几乎可以肯定,它基于CPU对CPU如何在内存中存储整数的决定)。
两种最常见的布局是(最低地址优先)
- 01 02 03 04 0a 0b 0c 0d(典型示例:ARM)
- 0d 0c 0b 0a 04 03 02 01(典型示例:x86/x64)
其他布局也是可能的。例如,如果32位CPU的编译器通过将两个32位整数相邻放置来滚动自己对__int64
的支持,它甚至可能会这样:
C和c++语言是精心设计的,所以这个细节并不重要;您可以编写代码,使其无论使用哪种表示方式都能正常工作。
当有人写这样的代码:
ucMyChar = (unsigned char*)&ui64MyInt;
,它们有意识地绕过c++的功能,独立于整数表示。(强制类型转换是一个很好的信号,表明正在进行一些类型系统的绕过!)
相关文章:
- 内置函数可查看CPP中的成员变量
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 在C++中释放内存期间,迭代器与指针有何不同
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 如何在程序执行时查看Valgrind Massif输出(或其他堆分析器)?
- 链接器命令失败,macOS 上的退出代码为 1(使用 -v 查看调用)
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 如何按指针查看堆栈跟踪
- QTree查看新行,没有布局就不可见已更改
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 如何查看在程序级别为我的程序创建了多少 vtable 和 vpointer
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 英特尔 PIN:如何查看推测性指令?