int v; // 找出v的符号
int sign; // 保存结果
// CHAR_BIT 是一个字节的位数,一般为8.
sign = -(v < 0); // 如果v < 0 则 -1, 否则为 0.
// 或者, 为了避免使用分支指令,标志寄存器 (IA32):
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
// 或者更简单的使用
sign = v >> (sizeof(int) * CHAR_BIT - 1);
后面的表达式在32位整数下面计算出sign = v >> 31,这招是比sign = -(v < 0)要快的。
当有符号的整数右移31位的时候,最左边的位被移到其他位,当为负数的时候最左边是1,反之为0,这跟cpu的架构也有关系。