通常的算术转换和整数提升

时间:2017-10-11 09:02:05

标签: c++ casting integer-promotion

我正在努力了解c转换的内幕,以及不同类型的促销和比较内容以及所有这些内容。

union myUnion{
int intVal;
float floatVal;};

if (m.floatVal == m.intVal)
{
    cout << "BINGO!";
}


if (*ptrInt == *ptrInt2)
{
    cout << "BINGO!"  << endl << *ptrInt << endl << *ptrInt2;
}

第一个if语句被评估为false,第二个if语句被评估为true。

c编译器如何解释此值m.floatVal,m.intVal。我的意思是在那里发生什么,进入汇编,因为那将在CPU上运行。

此外,m.floatVal,m.intVal根据我首先初始化的变量得到不同的值。

m.floatVal = 3;先得到一些东西 m.intVal = 3;先得到别的东西。

最后那里有相同的价值!?!?!?!?!?!?

第二个例子:

char minstogo = 0x98;
if (minstogo <= 7) {
    cout << "BEAST!";
} beast is printed

char minstogo = 0x98;
if ((unsigned char)minstogo <= 7) {
    cout << "BEAST!";
} nothing is printed

char minstogo = 0x98;
if (minstogo <= (unsigned char)7) {
    cout << "BEAST!";
} beast is printed

编译器如何解释这个混乱以及组件下发生了什么?

第三个例子: 浮点数如何转换为int?这些位都被重新映射了?

非常感谢你们!谢谢。

1 个答案:

答案 0 :(得分:2)

第一个例子:

union myUnion{
int intVal;
float floatVal;};

if (m.floatVal == m.intVal)
{
    cout << "BINGO!";
}

这是c ++中未定义的行为。写入intVal后,阅读floatVal是未定义的行为。写入floatVal后,阅读intVal是未定义的行为。