我试图理解下面的比较语句中发生了什么。
int n = 1;
std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" );
上面的语句对我的输出是-Y-
我的第一个问题是,为什么要将指针转换为 achar*
而不是 a int*
?
此外,如果我们将 char 与 int 进行比较,答案似乎应该是-N-
.
与 比较时,char 是否会自动转换为 int 1
?
那是一些可怕的代码,但它输出的原因 -Y-
是因为您有效地将 int 的内容n
视为字节数组,并且您的机器的字节顺序使得它int = 1
以与char[] = { 1 , 0 , 0, 0};
(don'不要依赖这个!)
因此,这就像你在做
int someInt = 1;
char someChar = 1;
if (someInt == someChar)
{
puts("-Y"-):
}
else
{
puts("-N"-):
}
要回答您的第二个问题(和标题问题),是的 C++(和 C)将隐式进行类型提升:请参阅C++ 运算符中的隐式类型转换规则
您可能将 char 与 int 进行比较,但这里 char 的值是多少?您无法仅从您发布的代码中分辨出来,并且在不同的环境中它可能会有所不同。
您不是将 char 转换为 int 并进行比较,而是切掉 int 的一部分,将其视为 char,然后将其提升并进行比较。在 little-endian 机器上它可能是 1,在 big-endian 机器上是 0。
答案取决于字节序:
>>> struct.pack('<i', 1)
'\x01\x00\x00\x00'
>>> struct.pack('>i', 1)
'\x00\x00\x00\x01'
-Y-
对应于小端字节序。