在比较中,字符是否转换为整数?

时间:2012-08-28 03:54:55

标签: c++ pointers

我试图了解下面的比较声明中会发生什么。

int n = 1;

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

上面的语句输出为-Y-

我的第一个问题是,为什么要将指针指向char*而不是int*

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

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

3 个答案:

答案 0 :(得分:3)

这是一些可怕的代码,但它输出-Y-的原因是因为你有效地将int n的内容视为字节数组,并且你的机器的字节顺序是这样的它以与int = 1相同的方式存储char[] = { 1 , 0 , 0, 0};的值(不要依赖于此!)

因此,这就像你在做什么

int someInt = 1;
char someChar = 1;
if (someInt == someChar)
{
  puts("-Y"-):
}
else
{
  puts("-N"-):
}

要回答你的第二个问题(和标题问题),是的C ++(和C)将隐式进行类型提升:见Implicit type conversion rules in C++ operators

答案 1 :(得分:1)

答案取决于结束:

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

-Y-对应于little-endian字节顺序。

答案 2 :(得分:1)

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

您没有将char转换为int并进行比较,您正在切掉int的一部分,将其视为char,然后将其推广并进行比较。在小端机器上它可能是1,在大端机器上是0。