【发布时间】:2021-02-21 03:47:34
【问题描述】:
在 C 1999 注释 86 中,与 6.5.4 5 对话(我的粗体字)
如果表达式的值以比要求更高的精度或范围表示 由强制转换命名的类型 (6.3.1.8),然后 强制转换指定转换,即使 表达式的类型与命名类型相同。
signed char a = -2;
unsigned char b = 1;
b = (short)a + (short)b;
b = (short)a + (short)b;。这是一个例子
如果表达式的值以比要求更高的精度或范围表示 按强制转换命名的类型 (6.3.1.8),
因为如果没有强制转换,a 和 b 都被提升为 int,它比由强制转换命名的类型 short 具有更高的精度或范围(假设 @987654327 @ 是 16 位,int 是 32 位)。
那么,在这种情况下,后一句
然后,即使表达式的类型与命名类型相同,强制转换也会指定转换。
我想知道这对b = (short)a + (short)b; 有何影响。
我的想法很简单。因为(cast) 的优先级高于加法+,所以首先a 和b 被(short) 强制转换,然后+ 的两个操作数通过通常的算术转换进行转换。但是“即使表达式的类型与命名类型相同,强制类型转换指定转换”这句话让我感到困惑。
【问题讨论】:
-
粗体部分是像
(double) 5.0这样的转换,您将double值5.0转换为double。 -
@Someprogrammerdude 但是
5.0和double的类型是相同的,并且具有相同的精度和范围。你的意思是只有粗体部分固定? -
"...即使表达式的类型..."
(double) 5.0的情况下的表达式是5.0。 “...与命名类型相同”(double) 5.0中的“命名类型”为double。所以演员(double) 5.0是从double到double的转换。 -
(double) 5.0是否满足“如果表达式的值是 ~ 通过强制转换 (6.3.1.8)”?我读了通常的算术转换。但是不知道为什么要指定6.3.1.8。 -
@Someprogrammerdude 抱歉之前的模棱两可的问题,我编辑了我的帖子以使事情变得清晰。如果您阅读我编辑的帖子,我将不胜感激。
标签: c language-lawyer c99 typecasting-operator