【发布时间】:2018-08-17 15:01:15
【问题描述】:
考虑到例如 unsigned char 将始终提升为 int,我是否可以假设如果我在转换之前不强制转换为 unsigned char,结果将始终由实现定义?
例如:
unsigned char c = 0x0F;
unsigned int a = c >> 2;
这里 c 在向右移动之前将被提升为 int。因此,移位将由实现定义,具体取决于编译器。
正确的方法是:
unsigned int a = (unsigned char)c >> 2;
我的问题是,这种说法是否属实:
对小于 int 的任何数据类型进行任何转换,如果不转换为无符号类型,将由实现定义?
【问题讨论】:
-
我不会将 unsigned char 转换为 unsigned char - 嗯。将什么投射到什么?
-
c >> 2与(unsigned char)c >> 2完全相同 -
不,它永远不会被实现定义,因为将 unsigned char 转换为 int 永远不会产生负 int,并且明确定义了有符号但不是负整数的转移。
-
"unsigned char 将始终被提升为 int" --> 最常见的情况。当
unsigned char范围超过int范围时,可以提升到unsigned。见@dbush comment。
标签: c