问题标签 [integer-promotion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1412 浏览

c++ - char 是默认提升的吗?

这可能是一个愚蠢的问题,但有人可以提供 C++11 和 C11 的标准参考:

char默认提升int为?

这里有一点背景:C 和 C++ 都有默认参数提升的概念(C++11:5.2.2/7;C11:6.5.2.2/6)。这需要在以下调用中提升参数:

对于函数调用,a转换为doubleb转换为int. 但是会发生什么c?一直觉得自己char也升职了int,但是在标准里找不到相关的说法。

0 投票
3 回答
566 浏览

c - 评估表达式时是否总是发生整数提升?

可能重复:
分配给较大宽度整数时的 C 整数溢出行为

我在谷歌搜索中没有找到明确的答案。假设您有两个表达式:

在评估表达式时(a16 * b16) / a16(a8 * b8) / a8它们是否总是int在评估期间提升到,然后在赋值之前将最终结果转换回所需的类型(int16_tint8_t),或者这个整数提升完全是可选的?是否总是在评估整数表达式时进行整数提升,还是只是允许?

如果它总是完成,那么我可以预期这两个操作不会溢出(假设int是 32 位)。如果只允许完成(而不是要求),那么操作可能会溢出。我想更好地了解这种行为。

0 投票
3 回答
1709 浏览

c - 通过省略号发送“long”和“size_t”的整数提升?

从实施的人的角度来看这个问题printf

由于 的参数printf通过省略号 ( ...) 传递,因此它们得到整数提升。我知道charshort并且int升职intlong long不会升职。对于他们的unsigned同行也是如此。

这意味着在读取可变参数时,va_arg(args, int)应该使用 for charshort而应该使用intwhile 。va_arg(args, long long)long long

我的问题是,做longsize_t获得晋升,如果他们这样做,晋升到什么级别?互联网上有很多关于整数提升的资源,但我还没有看到任何关于这些类型的信息。

PS我希望能参考该标准。

0 投票
4 回答
56165 浏览

c++ - 一个 double 是否将方程中的每个 int 都提升为 double?

是否存在一种浮点数据类型(例如double)确保所有 +、-、*、/、% 等数学运算都采用双操作数?

如果故事比这更复杂,是否有描述这些规则的资源?我应该不问这样的问题,并且总是明确地int转换到double等式的结果是什么时候double。这是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是可能依赖于编译器的类型。

0 投票
1 回答
1220 浏览

c++ - 为什么不是 common_type::type = long long?

common_type<long, unsigned long>::typeunsigned long因为关于积分提升后的操作数标准说...

[...]如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型

不要称积分提升系统有问题,但似乎如果有一个更大的有符号整数类型可以表示有符号和无符号操作数的范围,则应该使用它。

我知道有些平台可能有 long == long long,在这种情况下,上面的规则可以生效。但是如果有更大的有符号整数类型可用,不应该使用它吗?

0 投票
3 回答
4075 浏览

c++ - 整数提升 - 步骤是什么

此代码打印 B2

我阅读了有关整数提升的信息,但我仍然不清楚,它在此处的示例中是如何工作的?有人可以彻底发布编译器在扩大/截断值时遵循的步骤吗?

0 投票
5 回答
922 浏览

c++ - 扩大积分类型?

想象一下你有这个功能:

现在您在呼叫站点这样称呼它:

为什么,(从技术上讲)当您在函数声明中指定您期望 along并且您只传递一个没有L后缀的数字时,它是否被视为 a int

现在,我知道这是因为 C++ 标准是这样说的,但是,技术上的原因是什么,它65不仅被提升为类型long,从而为我们节省了忘记L后缀以使其明确地变成 long 的愚蠢错误?

我在 C++ 标准中发现了这一点:

4.7 积分转换[conv.integral]

5 作为积分促销允许的转换不包括在积分转换集中。

我可以想,缩小转换不是隐式进行的,但这里的目标类型显然比源类型更宽。

编辑

这个问题是基于我之前看到的一个问题,当你没有指定L后缀时,它的行为很有趣。 示例,但也许它是 C 的东西,而不是 C++?!

0 投票
1 回答
1196 浏览

c++ - 整数提升、有符号/无符号和 printf

我正在查看C++ Integer Overflow 和 Promotion,试图复制它,最后得到了这个:

cout阅读了上面提到的帖子后,我的预期是这样的,第二个也是如此printf:两者都打印 4294967291。printf但是,第一个打印 -5。现在,我的猜测是,这printf只是将 4294967291 的无符号值解释为有符号值,以 -5 结尾(这适合看到 4294967291 的 2 补码是 11...11011),但我不是 100 % 确信我没有忽略任何事情。那么,我是对的还是这里发生了其他事情?

0 投票
1 回答
158 浏览

c - 为什么当右侧操作数为字符变量且结果 >255 时,“int sum=ch1+ch2+ch2”不会溢出?

在这个程序中,我试图将字符变量相加的结果分配给一个整数变量。我确保加法的大小大于 255。所以我希望右边的表达式溢出,即使结果是 362,由于溢出,我希望在将结果转换为106后分配106 int,而不是362。但奇怪的是分配了362 。

无论字符是有符号还是无符号,结果都是一样的。为什么没有溢出和分配362 ?由于加法时右侧没有整数,并且所有操作数都是字符,我不希望它们是晋升为 int.

0 投票
5 回答
32231 浏览

c - 类型转换 - 无符号到有符号 int/char

我尝试执行以下程序:

对于这个程序,我得到了输出:

字符是不同的!!!int 是一样的!!!

为什么我们得到不同的输出?
输出应该如下?

字符是一样的!!!int 是一样的!!!

键盘链接。