当前位置: 首页 > 知识库问答 >
问题:

为什么在C和C++中的算术运算之前必须将一个short转换为int?

宗政法
2023-03-14
short s = 1, t = 2 ;
auto  x = s + t ;

共有1个答案

高山
2023-03-14

如果我们在6.3.1.8通常的算术转换一节中查看国际标准编程语言-C的基本原理,它说(我的重点是后面):

标准中关于这些转换的规则是对K&R中的规则的轻微修改:修改适应了添加的类型和保值规则。显式许可的添加是为了在“更宽”的类型中执行计算,而不是绝对必要的,因为这有时会产生更小、更快的代码,更不用说更经常的正确答案了。只要得到相同的最终结果,也可以通过Ias if规则以“更窄”的类型执行计算。总是可以使用显式转换来获得所需类型中的值

C99标准草案第6.3.1.8节涵盖了应用于算术表达式操作数的常用算术转换,例如第6.5.6节加法运算符说:

我们在6.5.5节乘法运算符中也找到了类似的文本。在短操作数的情况下,首先应用6.3.1.1节布尔、字符和整数中的整数提升,该节说:

如果int可以表示原始类型的所有值,则该值转换为int;否则,它将转换为无符号int。这些类型称为整数提升。48)所有其他类型都因整数提升而不变。

关于整数提升的基本原理或国际标准-编程语言-C的6.3.1.1一节中的讨论实际上更有趣,我将有选择地引用B/C,它太长了,不能完全引用:

[...]

无符号保留方法要求将两个较小的无符号类型提升为无符号int。这是一个简单的规则,并生成一个独立于执行环境的类型。

如果这些类型可以正确地表示原始类型的所有值,则该值保留方法要求将这些类型提升为有符号的int;否则,则要求将这些类型提升为无符号的int。因此,如果执行环境将short表示为小于int的东西,则无符号short将变为int;否则将变为无符号int。

 类似资料:
  • 问题内容: 缩小转换是指将可以容纳较大值的数据类型放入可以容纳较小值的数据类型。 但是,我不明白为什么将short转换为char会缩小转换范围,但是我有直觉,这与这两种数据类型的有符号/无符号有关,但我无法解释原因。 看起来这将是一个扩大的转换,或者至少不会缩小或扩大,因为它们都是16位并且可以容纳相同数量的值。 问题答案: 这是因为a 可以保持负值,而您可能从中看不到。让我举几个例子。 A(负)

  • 问题内容: 免责声明: 这不是真实示例。这只是这些语言如何工作的理论问题。 C / C ++,C#和Java在后和前增量运算符之间到底有什么区别? 这就是我使用VC ++ 10,Java 1.6和C#4所获得的 问题答案: Java和C#从左到右评估表达式,其副作用立即可见。 在C ++中,未指定子表达式的求值顺序,并且两次修改同一对象而没有插入顺序点的行为是未定义的行为。

  • 我有一个简单的程序来测量浮点乘法(和随机生成,编译g-O0)。在主机(Ubuntu 16.04)上运行时,每10000000次乘法得到约1.6秒,在图像“Ubuntu”的容器中运行时(无需重新编译),得到约3.6秒。有人能解释为什么它慢了2.5倍吗? p、 我多次运行程序来消除异常值。我不需要优化它,只需要详细解释那里发生了什么。 编译 要在构建后使用的容器内运行:

  • C++ 指针 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。 假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++ 在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在

  • CP首选项说: 特别是,算术运算符不接受小于int的类型作为参数,如果适用,在左值到右值转换后,会自动应用整数提升。 所有主要的编译器(g、clang和msvc)都说,当a和b都是short时,decltype(a b)是int。 但是,标准说: 整数升级[conv.prom]/1整数转换秩小于int的整数类型的PR值可以转换为int类型的PR值。 常用的算术转换[表达式算术转换]/1.5.1 -

  • 问题内容: 我已经看到了这个“快速平等协议”问题的答案,该问题提到了如何在全局范围内声明该方法。 如果我不采用,我仍然可以声明测试两种类型之间的相等性。 需要在全局范围内声明其实现这一事实,这使得该协议似乎是 附带的 ,也与协议 有所不同 ,即使已被采纳。 该协议除了仅使(我们和)编译器安全地知道我们的类型实现了协议所需方法的语法糖外,还有什么? 为什么即使对于协议,也必须全局声明操作员实现?这是