c - 为什么是 (int)((unsigned int)((int)v)?

标签 c casting bitwise-operators

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/

相关文章:

c++ - 如何解决支持库中发生的段错误问题?

java - 如何在 Java 中对 Polygon 对象应用变换

java - 存储用户输入的按位运算符的数据类型是什么

java - 如何将对象作为可比参数发送给方法?

c - 使用移位操作仅在一个字节中从右边获取四位

c# - C# 中左移位的奇怪行为

C - sbrk(size) 返回有效指针,但 sbrk(0) 为负值

c++ - 如何在 C++ 中查找大数模 1000000007 的阶乘?

c - c中绝对最快的for循环是什么?

C++ 指针作为 DWORD