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

Joh*_*zem 9 c c++ language-lawyer implicit-conversion

我正在使用带有编译器的MPC56XX(嵌入式系统),其中a int和a long都是32位宽.

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

typedef   signed int sint32;
typedef unsigned int uint32;
Run Code Online (Sandbox Code Playgroud)

在一个新版本中,没有太多文档就改变了:

typedef   signed long sint32;
typedef unsigned long uint32;
Run Code Online (Sandbox Code Playgroud)

我可以看出为什么这会是一件好事:整数在short和之间有转换等级long,所以理论上在使用第一组定义时可以应用额外的转换.

我的问题:鉴于包裹作者强加给我们的上述变化,是否存在可以想象的情况,这种变化会改变编译的代码,正确导致不同的结果?

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

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

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

DRH*_*DRH 9

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

您还可能遇到重载解决问题.假设您有两个具有以下定义的函数:

void func(int x);
void func(unsigned int x);
Run Code Online (Sandbox Code Playgroud)

并调用函数:

sint32 x;
func(x);
Run Code Online (Sandbox Code Playgroud)

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


Mat*_* M. 6

它可能会导致细微的问题,因为int默认情况下是字面数字.

考虑以下程序:

#include <iostream>

typedef signed short old16;
typedef signed int old32;

void old(old16) { std::cout << "16\n"; }
void old(old32) { std::cout << "32\n"; }

typedef signed short new16;
typedef signed long new32;

void newp(new16) { std::cout << "16\n"; }
void newp(new32) { std::cout << "32\n"; }

int main() {
  old(3);
  newp(3); // expected-error{{call of overload ‘newp(int)’ is ambiguous}}
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误,因为调用newp现在不明确:

prog.cpp: In function ‘int main()’:
prog.cpp:17: error: call of overloaded ‘newp(int)’ is ambiguous
prog.cpp:12: note: candidates are: void newp(new16)
prog.cpp:13: note:                 void newp(new32)
Run Code Online (Sandbox Code Playgroud)

然而它以前运作良好.

因此,在使用文字的情况下,可能会出现一些过载意外.如果你总是使用命名(并因此键入)常量,你应该没问题.