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

前端之家收集整理的这篇文章主要介绍了在两个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&C++相关文章