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

c - 制作普通的 int 64 位会破坏很多合理的代码吗?

直到最近,我还认为大多数系统实现者/供应商决定int在 64 位机器上保持纯 32 位是一种权宜之计。对于现代 C99 固定大小类型(int32_tanduint32_t等),对于每个大小为 8、16、32 和 64 的标准整数类型的需求大部分都消失了,似乎int也可以做成 64 位.

然而,C 中 plain 大小的最大实际后果int来自于 C 本质上没有关于小于int类型的算术。特别是,如果int大于 32 位,则对uint32_t值的任何算术运算的结果都是 type signed int,这是相当令人不安的。

这是int在实际实现中永久固定在 32 位的一个很好的理由吗?我倾向于说是的。在我看来,可能有一大类用途,当大于 32 位时会uint32_t中断。int即使应用一元减号或按位补码运算符也会变得危险,除非您重新转换为uint32_t.

当然,相同的问题也适用uint16_tuint8_t当前的实现,但每个人似乎都意识到并习惯于将它们视为“小于int”类型。

0 投票
2 回答
1529 浏览

c++ - C ++中整数提升和整数转换有什么区别

C++ 标准的第 4.5 节(整数提升)讨论了将整数类型转换为具有更高等级的类型的特定情况。

C++ 标准的第 4.7 节(积分转换)从(bullet 4.7.1)开始:

整数类型的右值可以转换为另一种整数类型的右值。枚举类型的右值可以转换为整数类型的右值。

据我了解,4.5 中描述的转换(可能除了项目符号 4.5.3(枚举)之外)可以单独使用 4.7 部分中的技术执行:4.5.1 和 4.5.2 完全由 4.7.1 覆盖;4.7.4 涵盖了 4.5.4。那么整个 4.5 部分的目的是什么?它启用了哪些额外的转换?也许我错过了一些限制?

PS我正在阅读标准的C++03版本。

0 投票
3 回答
11462 浏览

c++ - 两个字符相加产生 int

我制作了一个简单的程序并使用 GCC 4.4/4.5 编译如下:

g++ -c -Wconversion a.cpp

我有以下内容:

我对以下代码也有同样的警告:

谁能解释一下为什么添加两个字符(或两个无符号短裤)会产生 int?它是编译器错误还是符合标准?

谢谢。

0 投票
1 回答
2824 浏览

c++ - 了解 getopt() 示例。int 与 char 的比较

大家好我希望你能帮助我理解为什么getopt使用int以及getopt中optopt变量的处理。对 C++ 来说很新。

查看 getopt,optopt 被定义为一个整数。 http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html#Using-Getopt

和这里的例子, http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt

在这个例子中,我不明白的部分是如何在 switch 语句中将整数与 char 进行比较。

据我了解,geopt 的主要参数虽然是字符数组 argv,但它处理返回一个 int 的事实对我来说似乎很奇怪,我的期望是一个 char,并且我需要将任何数字参数转换为 int。char 是否会自动转换为它的 ANSI 代码并再次转换回来?printf 语句

据我所知,期待一个字符,但被赋予一个整数。为什么 getopt 在处理字符数组时会使用 int ?

我错过了一些非常明显的东西吗?我必须。

0 投票
5 回答
7075 浏览

c - 将 int 截断为 char - 是否已定义?

一个静态分析器在最后一行抱怨截断,大概是因为b在其位被翻转之前被提升为 int 并且结果将是 int 类型。

我只对提升的 int 的最后一个字节感兴趣——如果b是 0x55,我需要a是 0xAA。我的问题是,C 规范是否说明了截断是如何发生的,还是实现定义/未定义?是否保证a将始终获得我期望的值,或者它会在符合标准的平台上出错?

当然,在分配之前强制转换结果会使静态分析器静音,但我想知道首先忽略这个警告是否安全。

0 投票
3 回答
819 浏览

c++ - 添加两个字符时为什么没有整数溢出?

可能重复:
添加两个字符会产生 int

给定以下 C++ 代码:

输出是逻辑上预期的 150,但是表达式中不应该有整数溢出(a + b)吗?

显然,这里必须有一个整数提升来处理溢出,或者发生了我看不到的其他事情。我想知道是否有人可以启发我,所以我可以知道在整数提升和溢出方面我可以和不应该依赖什么。

0 投票
3 回答
10271 浏览

c++ - 当二元运算符两边的符号不同时,提升规则如何工作?

考虑以下程序:

+ 运算符如何“知道”要返回的正确类型?int一般规则是将所有参数转换为最宽的类型,但这里在and之间没有明确的“赢家” unsigned int。在第一种情况下,unsigned int必须被选为 的结果operator+,因为我得到了 的结果2147483648。在第二种情况下,它必须选择int,因为我得到的结果是-1。然而,在一般情况下,我看不出这是如何确定的。这是我看到的未定义行为还是其他?

0 投票
5 回答
205 浏览

c - 有没有办法证明对 int 的积分提升?

在纯 ansi C 中,有没有办法证明,给定

以下类型:

是int?

谢谢。

注意:我知道根据标准它是,但在 C++ 中,您可以使用 typeid 运算符来显示它。我希望能够显示c1 + c2是 C 中的 int。

0 投票
5 回答
7262 浏览

c - 在 C 中添加无符号整数

这里有两个非常简单的程序。我希望得到相同的输出,但我没有。我不知道为什么。第一个输出 251。第二个输出 -5。我可以理解为什么是 251。但是,我不明白为什么第二个程序给了我 -5。

方案 1:

输出:

方案 2:

输出:

0 投票
4 回答
1439 浏览

c - 在 unsigned int 的低 16 位中存储有符号的 short

我正在嵌入式系统上编写 C 语言。处理器架构是 32 位(sizeof(int)就是 32 位,sizeof(short)就是 16 位)。有一个 32 位变量是一个内存映射控制寄存器 ( CTRL_REG),它被指定为仅使用的低 16 位,它们包含一个带符号的 16 位整数值(写入高位无效)。内存访问必须是 32 位对齐的,所以我不能只将指针撞到几个字节上,也不能假设字节序。我担心自动类型提升会通过将符号位扩展到第 31 位而不是将其留在我想要的第 15 位来弄乱我存储的任何内容。在这个位置存储东西的最佳方式是什么?

这是我的原始代码,我几乎可以肯定它是错误的:

然后我尝试了这个,但我认为它仍然可能在分配时受到整数提升:

然后最后我想到了这个:

我不能很好地评估这些选项,因为它们都在我的测试中起作用,因为calibrationValue恰好是负数(它是每个设备特定的校准参数,因此在某些设备上可能是正数),所以在乘以 -2 后,我结束up 存储一个正值,因此我实际上并没有遇到我在测试中期望的问题。

非常感谢您的帮助,即使只是说“您想太多了”。