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
的指针的引用是否合法?即istx;字符c=*(字符*)&x代码>始终合法?@SethCarnegie:是的,因为每个对象的大小至少为1。