在两个32位宽的情况下,C(或C)中的“unsigned long”和“unsigned int”是否存在可观察的差异?

我正在使用一个编译器的MPC56XX(嵌入式系统),一个int和long都是32位宽.

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

typedef   signed int sint32;
typedef unsigned int uint32;

一个新版本中,这个更改没有太多的文档:

typedef   signed long sint32;
typedef unsigned long uint32;

我可以看到为什么这将是一件好事:整数具有短和长之间的转换排名,所以在使用第一组定义时理论上可以应用额外的转换.

我的问题:考虑到包作者对我们的上述变化,有可能想到这种变化会改变编译代码,正确导致不同的结果吗?

我熟悉“通常的一次转换”和“通常的二进制转换”,但我很难想出一个具体的情况,这可能会毁了我现有的代码.但这真的是无关紧要的吗?

我正在使用C89 / C94在纯C环境中工作,但我对C和C两个问题感兴趣.

编辑:我知道混合int与sint32可能会产生不同的结果,当它被重新定义.但是我们不允许直接使用原始的C类型,只能使用typedefed的.
我正在使用常量,一元/二进制运算符,转换等使用基于更改的类型定义的不同但正确的编译结果来寻找样本(表达式或代码段).

解决方法

这可能会导致微妙的问题,因为认情况下文字数字是int.

考虑following program

#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}}
}

这导致错误,因为对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)

而它之前工作正常.

所以可能会有一些重载令人惊讶的文字被使用.如果你总是使用命名(和如此键入的)常量,你应该没事.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...