我试图了解下面的比较声明中会发生什么。
int n = 1;
std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" );
上面的语句输出为-Y-
我的第一个问题是,为什么要将指针指向char*
而不是int*
?
另外,如果我们将char与int进行比较,似乎答案应该是-N-
。
与1
比较时,char是否会自动转换为int?
答案 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。