The website in which I found this code
int v, sign;
// or, to avoid branching on CPUs with flag registers (IA32):
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1)); // if v < 0 then -1, else 0.
此语句将变量 sign 赋给变量 v 的符号(-1 或 0)。我想知道为什么使用 (int)((unsigned int)((int)v)
而不是普通的 v?
最佳答案
请注意,您已经在问题中提取了表达式的一个片段(您引用了 (int)((unsigned int)((int)v)
,其中还有一个左括号 (
而不是右括号 )
)。赋值语句的 RHS 表达式完整为:
-(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
如果你加几个空格,你会发现:
-(int) ( (unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1) );
^ ^ ^^ ^ ^ ^ ^
| +------------++------+ +--------------------------+ |
+----------------------------------------------------------+
也就是说,外部 (int)
转换适用于所有:
((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
(int)
转换的内部转换是空洞的;其结果立即转换为 unsigned int
。 (unsigned int)
转换确保正确定义正确的移位。整个表达式确定最高有效位是 0 还是 1。外部 int
将结果转换回 int
,而 -
然后取反,所以如果 v
为负数,则表达式为 -1
,如果 v
为负数,则表达式为 0
零或正——这就是评论所说的。
关于c - 为什么是 (int)((unsigned int)((int)v)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33882676/