问题标签 [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.
c++ - char 是默认提升的吗?
这可能是一个愚蠢的问题,但有人可以提供 C++11 和 C11 的标准参考:
char
默认提升int
为?
这里有一点背景:C 和 C++ 都有默认参数提升的概念(C++11:5.2.2/7;C11:6.5.2.2/6)。这需要在以下调用中提升参数:
对于函数调用,a
转换为double
并b
转换为int
. 但是会发生什么c
?一直觉得自己char
也升职了int
,但是在标准里找不到相关的说法。
c - 评估表达式时是否总是发生整数提升?
可能重复:
分配给较大宽度整数时的 C 整数溢出行为
我在谷歌搜索中没有找到明确的答案。假设您有两个表达式:
在评估表达式时(a16 * b16) / a16
,(a8 * b8) / a8
它们是否总是int
在评估期间提升到,然后在赋值之前将最终结果转换回所需的类型(int16_t
或int8_t
),或者这个整数提升完全是可选的?是否总是在评估整数表达式时进行整数提升,还是只是允许?
如果它总是完成,那么我可以预期这两个操作不会溢出(假设int
是 32 位)。如果只允许完成(而不是要求),那么操作可能会溢出。我想更好地了解这种行为。
c - 通过省略号发送“long”和“size_t”的整数提升?
从实施的人的角度来看这个问题printf
。
由于 的参数printf
通过省略号 ( ...
) 传递,因此它们得到整数提升。我知道char
,short
并且int
升职int
而long long
不会升职。对于他们的unsigned
同行也是如此。
这意味着在读取可变参数时,va_arg(args, int)
应该使用 for char
,short
而应该使用int
while 。va_arg(args, long long)
long long
我的问题是,做long
并size_t
获得晋升,如果他们这样做,晋升到什么级别?互联网上有很多关于整数提升的资源,但我还没有看到任何关于这些类型的信息。
PS我希望能参考该标准。
c++ - 一个 double 是否将方程中的每个 int 都提升为 double?
是否存在一种浮点数据类型(例如double
)确保所有 +、-、*、/、% 等数学运算都采用双操作数?
如果故事比这更复杂,是否有描述这些规则的资源?我应该不问这样的问题,并且总是明确地int
转换到double
等式的结果是什么时候double
。这是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是可能依赖于编译器的类型。
c++ - 为什么不是 common_type::type = long long?
common_type<long, unsigned long>::type
是unsigned long
因为关于积分提升后的操作数标准说...
[...]如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型
不要称积分提升系统有问题,但似乎如果有一个更大的有符号整数类型可以表示有符号和无符号操作数的范围,则应该使用它。
我知道有些平台可能有 long == long long,在这种情况下,上面的规则可以生效。但是如果有更大的有符号整数类型可用,不应该使用它吗?
c++ - 整数提升 - 步骤是什么
此代码打印 B2
我阅读了有关整数提升的信息,但我仍然不清楚,它在此处的示例中是如何工作的?有人可以彻底发布编译器在扩大/截断值时遵循的步骤吗?
c++ - 扩大积分类型?
想象一下你有这个功能:
现在您在呼叫站点这样称呼它:
为什么,(从技术上讲)当您在函数声明中指定您期望 along
并且您只传递一个没有L
后缀的数字时,它是否被视为 a int
?
现在,我知道这是因为 C++ 标准是这样说的,但是,技术上的原因是什么,它65
不仅被提升为类型long
,从而为我们节省了忘记L
后缀以使其明确地变成 long 的愚蠢错误?
我在 C++ 标准中发现了这一点:
4.7 积分转换[conv.integral]
5 作为积分促销允许的转换不包括在积分转换集中。
我可以想,缩小转换不是隐式进行的,但这里的目标类型显然比源类型更宽。
编辑
这个问题是基于我之前看到的一个问题,当你没有指定L
后缀时,它的行为很有趣。 示例,但也许它是 C 的东西,而不是 C++?!
c++ - 整数提升、有符号/无符号和 printf
我正在查看C++ Integer Overflow 和 Promotion,试图复制它,最后得到了这个:
在cout
阅读了上面提到的帖子后,我的预期是这样的,第二个也是如此printf
:两者都打印 4294967291。printf
但是,第一个打印 -5。现在,我的猜测是,这printf
只是将 4294967291 的无符号值解释为有符号值,以 -5 结尾(这适合看到 4294967291 的 2 补码是 11...11011),但我不是 100 % 确信我没有忽略任何事情。那么,我是对的还是这里发生了其他事情?
c - 为什么当右侧操作数为字符变量且结果 >255 时,“int sum=ch1+ch2+ch2”不会溢出?
在这个程序中,我试图将字符变量相加的结果分配给一个整数变量。我确保加法的大小大于 255。所以我希望右边的表达式溢出,即使结果是 362,由于溢出,我希望在将结果转换为106后分配106 int
,而不是362。但奇怪的是分配了362 。
无论字符是有符号还是无符号,结果都是一样的。为什么没有溢出和分配362 ?由于加法时右侧没有整数,并且所有操作数都是字符,我不希望它们是晋升为 int
.