c++ - 当两者都是 32 位宽时,在 C(或 C++)中使用 `unsigned long` 和 `unsigned int` 是否存在可观察到的差异?

标签 c++ c implicit-conversion language-lawyer

我正在使用带有编译器的 MPC56XX(嵌入式系统),intlong 都是 32 位宽。

在一个必需的软件包中,我们对 32 位宽的类型有以下定义:

typedef   signed int sint32;
typedef unsigned int uint32;

在新版本中,这在没有太多文档的情况下更改为:

typedef   signed long sint32;
typedef unsigned long uint32;

我明白为什么这是一件好事:整数在 shortlong 之间有一个转换等级,所以理论上在使用第一组时可以应用额外的转换定义。

我的问题:考虑到包作者强加给我们的上述更改,是否存在可以想象的情况,这样的更改会更改已编译的代码,从而正确地导致不同的结果?

我熟悉“通常的一元转换”和“通常的二进制转换”,但我很难想出一个具体的情况,在这种情况下,这可能会真正破坏我现有的代码。但这真的无关紧要吗?

我目前在纯 C 环境中工作,使用 C89/C94,但我对 C 和 C++ 问题都感兴趣。

编辑:我知道将 intsint32 混合使用可能会在重新定义时产生不同的结果。但是我们不允许直接使用原始的 C 类型,只能使用类型定义的类型。
我正在寻找使用常量、一元/二元运算符、强制转换等的示例(表达式或片段),并根据更改的类型定义获得不同但正确的编译结果。

最佳答案

在 C++ 中,您可能会遇到函数重载问题。假设您有以下情况:

signed int func(signed int x) {
    return x + 1;
}

signed long func(signed long x) {
    return x - 1;
}

int main(void) {
    sint32 x = 5;
    std::cout << func(x) << std::endl;
}

在 typedef 定义更改之前,将打印值 6。更改后将打印值 4。虽然过载不太可能具有如此不同的行为,但这是有可能的。

您还可能遇到重载解析问题。假设您有两个定义如下的函数:

void func(int x);
void func(unsigned int x);

并通过以下方式调用函数:

sint32 x;
func(x);

在更改之前,函数调用是明确的,func(int) 将是完全匹配。在 typedef 更改后,不再有精确匹配(两个函数都需要很长时间),并且编译器失败,因为它无法确定要调用哪个重载。

关于c++ - 当两者都是 32 位宽时,在 C(或 C++)中使用 `unsigned long` 和 `unsigned int` 是否存在可观察到的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8428275/

相关文章:

c - 隐藏 GCC 警告 "set but not used"?

c - 子进程没有正常退出的原因是什么?

c++ - 与类型转换相关的排名意味着什么?

c++ - 编译cpp源仅在c支持下运行

c++ - 音频波形到整数序列

c++ - 有 libPNG 64 位吗?

scala - 为什么隐式转换在这里不起作用?

c++ - 使用 << 运算符将二进制文件写入 std::fstream

c - 使用 cormen 给出的算法在 C 中进行广度优先搜索

scala - 隐式类有时无法工作