我正在使用带有编译器的 MPC56XX(嵌入式系统),int
和 long
都是 32 位宽。
在一个必需的软件包中,我们对 32 位宽的类型有以下定义:
typedef signed int sint32;
typedef unsigned int uint32;
在新版本中,这在没有太多文档的情况下更改为:
typedef signed long sint32;
typedef unsigned long uint32;
我明白为什么这是一件好事:整数在 short
和 long
之间有一个转换等级,所以理论上在使用第一组时可以应用额外的转换定义。
我的问题:考虑到包作者强加给我们的上述更改,是否存在可以想象的情况,这样的更改会更改已编译的代码,从而正确地导致不同的结果?
我熟悉“通常的一元转换”和“通常的二进制转换”,但我很难想出一个具体的情况,在这种情况下,这可能会真正破坏我现有的代码。但这真的无关紧要吗?
我目前在纯 C 环境中工作,使用 C89/C94,但我对 C 和 C++ 问题都感兴趣。
编辑:我知道将 int
与 sint32
混合使用可能会在重新定义时产生不同的结果。但是我们不允许直接使用原始的 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/