问题标签 [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 - 为什么 OpenWatcom 发出:警告!W124:比较结果始终为 0
通过 OpenWatcom,我们(一位同事和我自己)收到以下警告:
我们拥有的代码当然是一个更大项目的一部分,但是导致警告的代码段相当于:
我认为应该将字面值提升为 的整数类型x
,但显然不是。
是什么赋予了?整数提升规则是否不适用于 64 位整数?
唯一的解决方案是显式转换 ( (x > (uint64_t)0xFFFFFFFFU)
) 还是类似的比较0xFFFFFFFFULL
?类型转换实际上会使警告消失,但我没有查看生成的代码来验证它是否仍然有意义。
笔记:
- 代码不编译为 C99,它使用 C89 和 C99 之间的东西(例如,包括 C++ 风格的单行注释)。
- Watcom 和 OpenWatcom 只是我们的一些团队成员使用的编译器,而 OpenWatcom 是唯一在那里抱怨的编译器。
c++ - 为什么向 int8_t 添加常量会将其提升为更大的类型?
在 gcc 中,向小于的整数类型添加或减去常量会int
导致int
.
给出 4。我在使用带有 . 的简单+=
语句时注意到了这一点-Wconversion
。设置了警告标志后,
给
wat.cpp:7:6:警告:从“int”转换为“int8_t {aka signed char}”可能会改变其值 [-Wconversion]
有没有办法抑制这个警告?为什么会出现这种情况?铸造似乎没有奏效。
c - 无符号和更大有符号类型之间的隐式转换行为不一致
考虑以下示例:
要编译,我使用的是 GCC 4.4.7(它没有给我任何警告):
我的结果是:
问题是为什么unsigned char
和unsigned short
值都正确地“传播”到 (signed) long
,而unsigned int
不是?对此有什么参考或规则吗?
以下是相应的gdb
(单词按小端顺序)的结果:
c++ - 为什么在 C 和 C++ 中的算术运算之前必须将 short 转换为 int?
从我从这个问题得到的答案来看,在从 C 执行算术运算时,C++ 似乎继承了转换为的这一要求short
。int
我能否请您思考一下为什么首先在 C 中引入这一点?为什么不将这些操作作为short
?
例如(取自 dyp 在评论中的建议):
x
将具有int类型。
c - 一元 + 运算符是否进行类型转换?
直到现在我都相信一元运算+
符是没有用的。
但是后来我遇到了以下示例:
这是否意味着+
在这里进行类型转换?
因为它的行为与以下相同
这迫使我认为+
正在做类型转换。
但后来我试穿double
这迫使我重新考虑一元运算+
符。
所以我的第二个问题是:一元运算符对运算+
符有特殊影响sizeof
吗?
c - 用 short int 补码运算符
上面的程序给出了输出:ffffaa55。我期待 o/p 只有 aa55,因为 short int 是 2 个字节。谁能解释一下?
c - 整数溢出如何在 C 中工作?
我对如何在定点环境中处理算术计算感到有些困惑。考虑以下代码行:
所以,我的问题是:我明白为什么案例 2 会产生错误的结果。但是 - 编译器在产生正确结果的情况 1 中做了什么?- 在情况 1 中算术运算本质上不是一样的吗?除了,它分为两个语句?- 我可以期待不同编译器的不同行为吗?
c - 一元 +/- 运算符怎么可能导致“-a”或“+a”中的积分提升,“a”是算术数据类型常量/变量?
这条看似微不足道的行来自 C 书 my Mike Banahan & Brady (Section 2.8.8.2)。
我可以理解隐式提升是如何在表达式中发挥作用的,例如c=a+b
取决于操作数的类型,但我无法理解如何以及在何种情况下同样可以出现在类似的东西中-b
,其中b是任何合法的操作数。你能解释一下,然后举一个恰当的例子吗?
提取的文本如下:
通常的算术转换适用于运算符的二进制形式的两个操作数。仅对运算符的一元形式的操作数执行整数提升。
更新:
为了避免被忽视,我在这里根据 OUAH 在评论中的回答添加了我所问的内容——这本书说' Only the integral promotions are performed
'......这是否意味着在这样的表达式x=-y
中,'x' 是一个长双精度数,而 'y' 是如果我们明确使用一元运算符,浮点数,'y' 不会被提升为长双精度数?我知道会是这样,但仍然要求它更清楚地了解“仅整数促销......”部分。
更新:
您能否举例说明以下按位运算符的提升是如何发挥作用的?对于最后三个,我是否应该假设每当在变量上使用它们时,它首先被提升为整数类型?前三个“通常的算术转换”到底是什么意思?你能举个小例子吗?如果可以在这里解决,我不想将其作为单独的问题发布。
c - 你能解释一下吗?“涉及混合类型操作数的规则不适用于移位运算符”
我无法理解Mike Banahan 的 C 书(第 2.8.2.3 节)的以下摘录中的“移位的结果与被移位的事物具有相同的类型(在积分提升之后)”这一行。
重要的是,涉及混合类型操作数的规则不适用于移位运算符。转移的结果与转移的东西具有相同的类型(在积分提升之后),并且不依赖于其他任何东西。
如果某些东西已经被提升为整数(在使用移位运算符期间需要),那么如何将它转换回与原来相同的类型,除非它当然位于赋值的右侧并且被分配给与整数提升之前类型相同的变量?此外,“涉及混合类型操作数的规则不适用于移位运算符”这一行究竟意味着什么?
请阐明问题的两个部分。谢谢你。
以下是本书的截图,分别与使用按位运算符和一般混合表达式期间的提升有关。
c - 如何在 C 中评估移位运算符?
我最近在使用 shift 进行操作时注意到了一个(奇怪的)行为>>
<<
!
为了解释它,让我编写这个小的可运行代码,它执行两个应该是相同的操作(在我的理解中),但我对不同的结果感到惊讶!
跑的时候,a = 5
和b = 1
。我希望它们都等于1!有人可以解释为什么我得到这样的结果吗?
PS:在我的环境中,大小unsigned char
为 1 字节