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

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

概述我正在使用一个编译器的MPC56XX(嵌入式系统),一个int和long都是32位宽. 在所需的软件包中,我们对32位宽类型有以下定义: typedef signed int sint32;typedef unsigned int uint32; 在一个新版本中,这个更改没有太多的文档: typedef signed long sint32;typedef unsigned long @H_404_1@我正在使用一个编译器的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 ambiguousprog.cpp:12: note: candIDates are: voID newp(new16)prog.cpp:13: note:                 voID newp(new32)

而它之前工作正常.

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

总结

以上是内存溢出为你收集整理的在两个32位宽的情况下,C(或C)中的“unsigned long”和“unsigned int”是否存在可观察差异?全部内容,希望文章能够帮你解决在两个32位宽的情况下,C(或C)中的“unsigned long”和“unsigned int”是否存在可观察的差异?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1251483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存