问题标签 [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 回答
454 浏览

language-design - 通常的算术转换——一套更好的规则?

考虑以下代码:

在 C++、C#、D 和 Java 中,两个函数调用都解析为“int”重载……我已经意识到这是“规范中的”,但为什么语言会这样设计呢?我正在寻找更深层的原因。

对我来说,结果是能够表示两个操作数的所有可能值的最小类型是有意义的,例如:

这将消除不方便的代码,例如short s3 = (short)(s1 + s2),以及 IMO 更加直观和易于理解。

这是 C 时代遗留下来的遗产,还是当前行为有更好的理由?

0 投票
2 回答
30620 浏览

c - 在存在 unsigned int 和 signed int 的 C 表达式中,哪种类型将提升为哪种类型?

我有一个关于 C 语言标准中的数据类型提升规则的查询。C99 说:

C 整数提升还要求“如果 int 可以表示原始类型的所有值,则将该值转换为 int;否则,将其转换为 unsigned int。”

我的问题是,如果存在 C 语言表达式,unsigned intsigned int哪种类型将提升为哪种类型?

例如int,不能表示unsigned int(值大于MAX_INT值)的所有值,而unsigned int不能表示 -ve 值,那么在这种情况下,什么类型被提升为什么?

0 投票
1 回答
1133 浏览

c - C: 8x8 -> 16 位乘法精度由整数提升保证?

我试图弄清楚 C 标准(C90,虽然我正在研究 Derek Jones 的带注释的 C99 书)是否保证我不会丢失将两个无符号 8 位值相乘并存储到 16 位结果的精度。一个示例语句如下:

我们的 Keil 8051 编译器(目前为 v7.50)将生成一条 MUL AB 指令,该指令将 MSB 存储在 B 寄存器中,将 LSB 存储在累加器中。如果我首先将 foo 转换为 unsigned int :

然后编译器正确地决定我需要一个 unsigned int 并生成对 16x16 位整数乘法例程的昂贵调用。我想毫无疑问地争辩说,这种防御措施是不必要的。当我阅读 6.3.1.1 中描述的整数提升时,第一行的效果应该就像 foo 和 10 提升为 unsigned int,执行乘法,并将结果作为 unsigned int 存储在 foo_u16 中。如果编译器知道执行 8x8->16 位乘法而不损失精度的指令,那就更好了;但精度是有保证的。我读对了吗?

最好的问候,克雷格布洛姆

0 投票
1 回答
462 浏览

integer-promotion - C 函数调用中的参数提升

我从----关于什么时候开始默认提升:当参数的预期类型未知时使用默认参数提升,也就是说,当没有原型或参数是可变参数时。

但是一个让我困惑的例子是:

在上面的例子中很清楚:在main中调用func时,不需要提升参数a和b,但是输出显示&a = &b +4而不是&a = &b+1。如果没有提升,为什么两个 CHAR 参数之间有 4 个字节?

0 投票
4 回答
288 浏览

c++ - 通过引用传递和返回参数时的整体提升?

我正在阅读有关重载解析的内容,但发现了一些困扰我的内容...在以下代码中:

我的理解是创建了两个临时 int,并将它们分配在属于 SomeFunction 的堆栈上。因此,当 MaxValue 返回时,r2 将引用这些临时变量之一(在本例中,是保存值 3 的变量)。因此,传递 r2 应该是安全的。

问题是,如果我的理解没问题,这是标准行为吗(请验证)?如果不是,请解释上面代码中发生的情况。

非常感谢

0 投票
2 回答
7016 浏览

c - 位移和整数提升?

通常,C 要求将二元运算符的操作数提升为更高级别操作数的类型。这可以用来避免用冗长的强制转换填充代码,例如:

等等

但是,我发现,至少对于 gcc,这种行为不适用于位移。IE

我希望右手操作数的类型会导致左手操作数被提升为unsigned long long以便移位成功。但是,gcc 会打印一个警告:

gcc 是否损坏,或者标准是否对位移的类型提升规则做出了一些例外?

0 投票
1 回答
1461 浏览

c - 尤达条件和整数促销

将大于 的类型int与整数常量进行比较时,我应该将常量放在左侧还是右侧,以确保执行正确的比较?

或者应该是:

是否存在任何一种情况与比较-1LL(where int64_tis long long)不同的情况?

0 投票
2 回答
2616 浏览

c - 算术运算期间的数据类型提升:-1 < (unsinged int) 1 == false

打印less than。因为,(unsigned char) 1 被转换为 (signed char) 1然后: (signed) -1 < (signed) 1, 因此输出是less than.

但是如果我将上面的代码更改if ( (-1 < (unsigned int) 1 )

那么输出是NOT less than

所以很明显,当我将 unsigned char 更改为 unsigned int 时:

  • (有符号)-1 转换为无符号整数 [正好相反]
  • 因为 -1 存储为 2 对 1 的补码;位模式被评估为 255(可能)
  • 因此 255 < 1 将评估为 false,否则将执行。
  • 即使你用int a = -1;'-1'代替相同的结果

问题:

  1. 在有符号和无符号算术期间......如何确定是否将有符号转换为无符号,反之亦然。

  2. 为什么 unsigned char 和 char 之间的算术转换不同:显然 unsigned 被转换为有符号和无符号 int 和 int :显然有符号是转换器到无符号

PS:我知道这不依赖于编译器..所以不要说它是。

0 投票
5 回答
6728 浏览

c - 如果 char c = 0x80,为什么 printf("%d\n", c << 1) 输出 -256?

-256在这种情况下输出。如果我写c << 0,那么输出是-128.

我不明白这段代码背后的逻辑。

0 投票
7 回答
2857 浏览

c++ - 面试问题中的这个位操作代码有什么问题?

我正在查看此页面: http: //www.devbistro.com/tech-interview-questions/Cplusplus.jsp,但不明白这个问题:

以下代码可能有什么问题?

注意:向候选人提示他们正在开发的基础平台。如果这个人仍然没有发现代码有任何问题,那么他们就没有使用 C++ 的经验。

有人可以详细说明吗?

谢谢!