0

我试图理解下面的比较语句中发生了什么。

int n = 1;

std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" );

上面的语句对我的输出是-Y-

我的第一个问题是,为什么要将指针转换为 achar*而不是 a int*

此外,如果我们将 char 与 int 进行比较,答案似乎应该是-N-.

与 比较时,char 是否会自动转换为 int 1

4

3 回答 3

3

那是一些可怕的代码,但它输出的原因 -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++ 运算符中的隐式类型转换规则

于 2012-08-28T04:02:05.810 回答
1

您可能将 char 与 int 进行比较,但这里 char 的值是多少?您无法仅从您发布的代码中分辨出来,并且在不同的环境中它可能会有所不同。

您不是将 char 转换为 int 并进行比较,而是切掉 int 的一部分,将其视为 char,然后将其提升并进行比较。在 little-endian 机器上它可能是 1,在 big-endian 机器上是 0。

于 2012-08-28T04:08:11.523 回答
1

答案取决于字节序:

>>> struct.pack('<i', 1)
'\x01\x00\x00\x00'
>>> struct.pack('>i', 1)
'\x00\x00\x00\x01'

-Y-对应于小端字节序。

于 2012-08-28T04:06:45.857 回答