【问题标题】:Usual arithmetic conversions and Integer promotion通常的算术转换和整数提升
【发布时间】:2017-10-11 09:02:04
【问题描述】:

我正在尝试了解 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

编译器如何解释这种混乱以及程序集发生了什么?

第三个例子: 如何将浮点数转换为整数?谁的位都被重新映射了?

非常感谢你们!谢谢。

【问题讨论】:

  • 你对联合的理解是错误的:根本没有转换。检查此链接:tutorialspoint.com/cprogramming/c_unions.htm
  • 技术上(根据标准)if (m.floatVal == m.intVal) 调用 未定义的行为,因为一次只能激活 union 的一个成员(实际上大多数编译器将它们视为 C 中的union
  • 当你有 C++ 标记时,你一直说 C。您是按照代码建议的那样询问 C++,还是真的询问 C?
  • 可能会发生的事情是它只是将 int 的原始字节解释为浮点数,反之亦然,这将在每种情况下给出完全不同的值,因为 int 和浮点数非常不同的表示。当然,正如其他人指出的那样,这是未定义的行为,所以它可以做任何事情......

标签: c++ casting integer-promotion


【解决方案1】:

第一个例子:

union myUnion{
int intVal;
float floatVal;};

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2014-03-31
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2023-03-23
    相关资源
    最近更新 更多