Signed Short (Signed Int16) 乘法解释
Signed Short (Signed Int16) Multiplication Explanation
Signed Short (Signed Int16) 乘法解释?
short ss = -32768; // 0x8000 SHRT_MIN
ss *= (short) -1;
printf ("%d", (int)ss); // Prints -32768
值为 -32768 乘以 -1 的无符号短整型如何成为其自身的机制是什么?我的猜测是 (int)32768 ---> 溢出并返回到 -32768 但这里没有任何地方要求提升为整数或任何更大的数据类型。
正在寻找定义此行为的 C 规范部分。
这里没有未定义的行为——假设 int
比 16 位宽。
这个:
ss *= (short) -1;
相当于:
ss = ss * (short)-1;
*
的两个操作数从 short
提升 到 int
(通过 整数提升), 并且乘法在 int
类型中完成。它产生 int
值 32768
(同样,除非 INT_MAX == 32767
,这是合法的,但在现代非嵌入式系统中很少见)。 (C 没有对窄于 int
和 unsigned int
的整数类型的算术运算。)
int
值被转换回 short
。与算术运算不同,当值不适合目标类型时,将整数值转换为有符号整数结果会产生实现定义的结果(或引发实现定义的信号,但我认为没有任何实现那样做)。
将 32768
转换为类型 short
将 可能 产生 -32768
.
签名转换的行为在 N1570 6.3.1.3p3:
中指定
Otherwise, the new type is signed and the value cannot be represented
in it; either the result is implementation-defined or an
implementation-defined signal is raised.
整数提升在 6.3.1.1p2:
中有描述
If an int
can represent all values of the original type (as restricted
by the width, for a bit-field), the value is converted to an int
;
otherwise, it is converted to an unsigned int
. These are called the
integer promotions. All other types are unchanged by the integer promotions.
Signed Short (Signed Int16) 乘法解释?
short ss = -32768; // 0x8000 SHRT_MIN
ss *= (short) -1;
printf ("%d", (int)ss); // Prints -32768
值为 -32768 乘以 -1 的无符号短整型如何成为其自身的机制是什么?我的猜测是 (int)32768 ---> 溢出并返回到 -32768 但这里没有任何地方要求提升为整数或任何更大的数据类型。
正在寻找定义此行为的 C 规范部分。
这里没有未定义的行为——假设 int
比 16 位宽。
这个:
ss *= (short) -1;
相当于:
ss = ss * (short)-1;
*
的两个操作数从 short
提升 到 int
(通过 整数提升), 并且乘法在 int
类型中完成。它产生 int
值 32768
(同样,除非 INT_MAX == 32767
,这是合法的,但在现代非嵌入式系统中很少见)。 (C 没有对窄于 int
和 unsigned int
的整数类型的算术运算。)
int
值被转换回 short
。与算术运算不同,当值不适合目标类型时,将整数值转换为有符号整数结果会产生实现定义的结果(或引发实现定义的信号,但我认为没有任何实现那样做)。
将 32768
转换为类型 short
将 可能 产生 -32768
.
签名转换的行为在 N1570 6.3.1.3p3:
中指定Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
整数提升在 6.3.1.1p2:
中有描述If an
int
can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to anint
; otherwise, it is converted to anunsigned int
. These are called the integer promotions. All other types are unchanged by the integer promotions.