【问题标题】:Signed Short (Signed Int16) Multiplication Explanation有符号短(Signed Int16)乘法解释
【发布时间】:2019-11-01 03:45:23
【问题描述】:

有符号短(有符号 Int16)乘法解释?

short ss = -32768; // 0x8000 SHRT_MIN
ss *= (short) -1;
printf ("%d", (int)ss);  // Prints -32768

值 -32768 乘以 -1 的 unsigned short 自身的机制是什么?我的猜测是 (int)32768 ---> 溢出并返回到 -32768 但这里没有要求提升到整数或任何更大的数据类型。

查找定义此行为的 C 规范部分。

【问题讨论】:

  • 挖掘为什么它是未定义的......“整数溢出的 C/C++ 方法是提供在您正在使用的机器上最快的行为,所以在某些机器上(这里假设 16-位有符号整数):“stackoverflow.com/questions/13993047/…

标签: c types short


【解决方案1】:

这里没有未定义的行为 -- 假设 int 的宽度超过 16 位。

这个:

ss *= (short) -1;

相当于:

ss = ss * (short)-1;

* 的两个操作数都从short 提升到int(通过整数提升),并且乘法在int 类型中完成.它产生int32768(同样,除非INT_MAX == 32767,这是合法的,但在现代非嵌入式系统中很少见)。 (C 对小于 intunsigned int 的整数类型没有算术运算。)

int 值被转换回short。与算术运算不同,将整数值转换为有符号整数结果,当值不适合目标类型时,会产生实现定义的结果(或引发实现定义的信号,但我不认为有任何实现这样做)。

32768 转换为类型short可能产生-32768

签名转换的行为在N1570 6.3.1.3p3 中指定:

否则,新类型有符号,值无法表示 在里面;结果是实现定义的或 引发了实现定义的信号。

整数提升在 6.3.1.1p2 中描述:

如果 int 可以表示原始类型的所有值(受限制 通过宽度,对于位域),值被转换为 int; 否则,它将被转换为 unsigned int。这些被称为 整数促销。整数提升不会改变所有其他类型。

【讨论】:

  • 确实有很多实现会发出信号,但它们不是通用计算机。
  • @AnttiHaapala:你能说出一个吗?具体来说,是否有 C99 或 C11 实现在有符号整数转换时引发信号(N1570 6.3.1.3 第 3 段允许)?
  • 很好地解决了 32 位 int 缺少 int 溢出问题。
  • 如前所述,结果取决于 CPU 的架构。更多信息,stackoverflow.com/questions/21449/types-of-endianness
  • @snr:我不认为字节序会影响这一切。
猜你喜欢
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多