c++ - char* 如何以十六进制读取这个整数?它在 ostream::write() 中如何工作?

标签 c++ pointers char hex octal

#include <iostream>
using namespace std;

int main(){
    int x = 0x414243;
    cout.write( (char*)&x, 1);
    cout.write( ((char*)&x) + 1, 2);
}

输出为:

CBA

我不明白 (char*)& 对 x 做了什么。

查看这个 ASCII 表 http://www.asciitable.com/ ,在我看来 write() 正在用八进制写 141, 142, 143...相反!

char* 是如何做到这一点的?

最佳答案

大写字母'C''B''A'的ASCII码分别是67、66和65,即0x43、0x42 和 0x41。

您的计算机似乎是 32 位 little-endian ,因此 0x00414243 的八位字节(为了清楚起见,额外加了两个零,以完成 32 位 int),如下所示放置在内存中:

0x43, 0x42, 0x41, 0x00

这表示一个以 null 结尾的字符串“CBA”

请注意,在大端硬件上,八位字节将以相反的顺序放置,即

0x00, 0x41, 0x42, 0x43

因此将此数字解释为以 null 结尾的字符串将产生空输出。

关于c++ - char* 如何以十六进制读取这个整数?它在 ostream::write() 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44502685/

相关文章:

c++ - 静态 constexpr 成员的 undefined reference 错误

c++ - 指向类对象的指针 vector

c++ - 使用 char 确定输出不起作用

C - 在内存被释放()之后访问数据?

c - C语言中指针的使用

c - 一个计算字符串中有多少个不同字符的函数

在 C 代码中调用两个函数会停止程序

c++ - 设置一个项目,该项目将使用和不使用预编译头文件进行编译

c++ - 将代码从 Matlab 移植到 C++

c++ - 如何将此代码重构为多线程版本?