问题标签 [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 投票
1 回答
349 浏览

c - 将已签名的字符读取为未签名 - 类型提升

考虑这个小程序:

正如预期的那样,它的输出是-1(考虑char在我的系统中签名)。我想做的是让它打印255。这当然是对真实情况的简化,我不能只定义 c为无符号。

第一个可能的更改是使用%uas formatter,但这里适用通常的类型提升规则,并且数字打印为 2 32 - 1。

那么有没有办法在将签名的字符提升为int之前将其读取为无符号?我可以创建一个指向设置为地址的无符号字符的指针c,然后再取消引用它,但不确定这是否是最好的方法。

0 投票
3 回答
9380 浏览

c - C中的类型提升

我对以下代码感到很困惑:

返回:

似乎表达式 (a - b) 的类型为 uint32_t。我不明白为什么,因为两个运算符都是 uint16_t。

谁能给我解释一下?

0 投票
3 回答
879 浏览

c - C 中的常用算术转换:这个特定规则背后的基本原理是什么

来自 k&R C

  • 首先,如果任一操作数为 long double,则将另一个操作数转换为 long double。
  • 否则,如果任一操作数为双精度,则另一个将转换为双精度。
  • 否则,如果任一操作数为浮点数,则另一个将转换为浮点数。
  • 否则,对两个操作数执行积分提升;...

这意味着下面的表达式

实际上被计算为

这条规则背后的理由是什么?

如果 a、b 和 c 都很短,这些转换会发生吗?

0 投票
2 回答
946 浏览

haskell - 使用像“Int8”这样的低位整数类型以及它们的用途

最近我了解到,每个计算周期都在机器字上执行,在大多数当代处理器和操作系统上都是 32 位或 64 位。那么使用较小的位大小值(如Int16, Int8, )有什么好处Word8?它们究竟是为了什么?只是减少存储吗?

我编写了一个复杂的计算程序,它由几个模块组成,但只有一个返回Word64值的函数接口,所以整个程序都会产生Word64值。我对这个问题的答案很感兴趣,因为在这个程序中,我发现自己使用了很多不同的Integral类型,比如Word16Word8来表示小实体,并且看到它们经常被转换fromIntegral让我思考:我在那里犯了错误吗?那些我不知道被盲目吸引的类型的确切好处是什么?fromIntegral使用其他整数类型并最终将它们转换为或者我应该在任何地方都使用它是否有意义Word64

0 投票
3 回答
4121 浏览

c - MISRA C:2004,移位错误

我正在使用带有 MISRA C:2004 检查的 IAR Workbench 编译器。
片段是:

MISRA 错误是: 错误[Pm136]:从基础 MISRA 类型“unsigned char”到“unsigned int”的非法显式转换(MISRA C 2004 规则 10.3)

我在上面的任何代码中都没有看到任何unsigned char内容。

讨论为什么 Misra 会在这里抛出错误?讨论了可能具有与左移不同的提升规则的乘法。

我的理解是编译器应该将表达式提升为更大的数据类型,而不是降级为更小的数据类型。

这里到底发生了什么?

如何使代码符合 MISRA C:2004?

编辑1:

将错误行更改为:

不会使错误消失。

0 投票
2 回答
821 浏览

c - 机器上 int 数据类型的宽度

是否可以说 int 数据类型的宽度取决于 ALU 的数据宽度?例如,是否可以说 32 位处理器的 int 数据类型为 32 位宽?同样对于 16 位和 8 位(请注意 C 保证 int 的大小至少大于 16 位)。

0 投票
1 回答
6731 浏览

c - 整体推广

关于整数提升,有符号整数何时不能代表原始类型的所有值?

来自文本 K&R,C 编程语言,第 2 版。页。174

A.6.1 积分促销

一个字符、一个短整数或一个整数位域,无论是否有符号,或枚举类型的对象,都可以在可以使用整数的表达式中使用。如果一个 int 可以表示原始类型的所有值,则将该值转换为 int;否则,该值将转换为 unsigned int。这个过程称为积分提升。

此代码显示了我的系统的类型限制:

结果是:

有符号的 int 类型比任何其他类型都大,那么它什么时候会回落到 UINT_MAX 呢?

0 投票
1 回答
973 浏览

gcc - GCC,奇怪的整数提升方案

我正在使用 GCC v4.4.5,并且我发现了一个我没想到的默认整数提升方案。

为了激活足够的警告以防止隐式错误,我激活了选项 -Wconversion,从那时起,我注意到当我执行下面的代码时,出现警告“从 'int' 转换为 'short int' 可能会改变其值”

这意味着"sB + sC"被提升为int,然后分配给sA,它是有符号的 short。要修复这个警告,我必须像这样投射它。

此警告也出现在下面的代码中。

并且可以通过删除运算符+=来修复...

这有点烦人,因为我不能使用运算符+=-=

我希望 GCC 根据操作数选择正确的整数提升。我的意思是,sA=sB+sCsA+=5不应该被提升为int因为它们都被签署了 short

我知道默认情况下提升为int可以防止溢出错误,但这有点烦人,因为我必须转换大部分代码或将变量更改为int

我可以使用 GCC 选项来展示这个整数提升方案吗?

谢谢你的帮助。

0 投票
2 回答
4725 浏览

c - 使用运算符进行整数提升 <<

类似于问题Bitshift and integer Promotion?,我有一个关于使用左移位时整数提升的问题。

在这种情况下, value8 将首先提升为 unsiged int 还是特定于实现?

6.5.7 位移位运算符... 3 Sematics ...
整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

它说“对每个操作数执行整数提升”。,但是这里的推广规则是什么?

我认为它应该是convert to int if lesser rank than int,但我找不到它。

我问这个,因为一个编译器(Renesas nc30wa)没有升级为 int,所以我的样本的结果总是 0。

在这个平台上,char 为 8 位宽,int 为 16 位。

0 投票
4 回答
661 浏览

c++ - 为什么一元减法执行积分提升?

T 是一个模板参数,short在这种情况下是 a。一元减号显然执行积分提升。

  • 为什么一元减法执行积分提升?
  • 如果auto更改为T不生成警告,但应该将 int 分配给 short。为什么没有警告(可能是 VS 很花哨)?