C++ C/C+中的指针和铸件+;

C++ C/C+中的指针和铸件+;,c++,c,pointers,casting,endianness,C++,C,Pointers,Casting,Endianness,我对这种演员阵容感到很困惑。有人能解释一下这句话里到底发生了什么吗 x = *(char*)&n; 这是完整的代码,用于知道机器是小端还是大端 int n = 0x1234567; char x; x = *(char*)&n; &n取n的地址,但至关重要的是,它是n的最低地址字节(char*)告诉编译器将该地址视为指向字符的指针,即指向单个字节的指针*取消引用,即获取存储在该地址的字节值 因此,总体效果是将x设置为存储在n

我对这种演员阵容感到很困惑。有人能解释一下这句话里到底发生了什么吗

x = *(char*)&n;
这是完整的代码,用于知道机器是小端还是大端

 int n = 0x1234567;
 char x;
 x = *(char*)&n;

&n
n
的地址,但至关重要的是,它是
n
的最低地址字节
(char*)
告诉编译器将该地址视为指向
字符的指针,即指向单个字节的指针<代码>*
取消引用,即获取存储在该地址的字节值


因此,总体效果是将
x
设置为存储在
n
的最低寻址字节中的值,该值取
n
的地址,即整数的地址

(字符*)(&n)
将此信息重新解释为
字符的地址

*(char*)(&n)
取消引用此地址,也就是说,位于该地址的
char
的值。换句话说,它是表示整数
n
的第一个字节的值

现在,您可以检查这是
0x01
还是
0x67
,以确定整数的存储方式


作为旁注:总是允许重新解释任何有效地址作为字符的地址并检查它,无论是在C还是C++中。每当您想要执行I/O时,这是必需的,因为您只能输入/输出以这种方式获得的哑字节流(也就是说,您可以将任何

tx;
视为
char[sizeof(T)]
并通过
(char*)&x访问它)。。在使用32位整数的big-endian环境中,数字将按此字节顺序存储在内存中

01 23 45 67
在小endian环境中,它将是这样的顺序

67 45 23 01
如果强制将指向初始化int的
int
指针强制转换为
char
指针,则char指针将被转移到int的第一个字节,因为它存储在内存中

在大端环境中,这将遵从
01
,而在小端环境中,这将是
67


如果整数不是32位,则会得到不同的值。

。。。在OP的示例中,根据endianness的不同,它将是
0x67
0x01
。@Oli Charlesworth感谢您的帮助。所以,写起来就不一样了:
x=(char)n
@Manolete-
x
如果您这样做,它将始终是
0x67
。@Manolete:否,它将
n
的整个值转换为
char
,并将其截断为
0x67
。遍历
char
指针可获取值中的第一个或最后一个字节。@Manolete:No。这将简单地将
n
转换为
char
(有效地执行
n%256
)。这将是尾数不变的(也就是说,你总是会得到相同的结果)。你说过将任何地址解释为
char*
是合法的。取消对任何被解释为
char*
T
的指针的引用是否合法?即is
tx;字符c=*(字符*)&x始终合法?@SethCarnegie:是的,因为每个对象的大小至少为1。