我正在学习整数的二进制表示形式,并试图编写一个函数,该函数使用饱和度返回int
乘以2的结果。思考过程是,如果值正溢出,则函数返回INT_MAX
,反之,如果值负溢出,则返回INT_MIN
。在所有其他情况下,二进制值左移1。
我想知道为什么我必须将值0xC0000000
强制转换为int
才能使我的函数在传递参数x = 1
时正常工作。
这是我的职能:
int timestwo (int x){
if(x >= 0x40000000) // INT_MAX/2 + 1
return 0x7fffffff; // INT_MAX
else if(x < (int) 0xC0000000) // INT_MIN/2
return 0x80000000; // INT_MIN
else
return x << 1;
return 0;
}
由常数0xC0000000
指定的值将不适合int
(假定为32位),但确实适合unsigned int
,因此此常数的类型为unsigned int
。此无符号值大于1,因此比较结果为false。
强制转换为int
的结果实际上是实现定义的,尽管在二进制补码系统上,这通常会产生您期望的结果。