【发布时间】: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