char* 如何以十六进制读取这个整数?它在 ostream::write() 中是如何工作的?
How does char* read this integer in hexadecimal? How is it working in ostream::write()?
#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 table 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 结尾的字符串会产生空输出。
您平台上的整数类型很可能超过一个字节或 char
。
因为它的长度超过了一个char
,所以它可以按最低有效字节在前(a.k.a。小端)或最高有效字节在前(大端)排序。
表达式(char *) x
是指向整数第一个字符的指针。
因此,它可能是 0x00 或 0x43,具体取决于您平台的字节顺序(假设 x
的长度为 4 个字节)。
#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 table 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 结尾的字符串会产生空输出。
您平台上的整数类型很可能超过一个字节或 char
。
因为它的长度超过了一个char
,所以它可以按最低有效字节在前(a.k.a。小端)或最高有效字节在前(大端)排序。
表达式(char *) x
是指向整数第一个字符的指针。
因此,它可能是 0x00 或 0x43,具体取决于您平台的字节顺序(假设 x
的长度为 4 个字节)。