不用比较运算符及循环控制语句,判断int型的a、b两数的大小
生活随笔
收集整理的這篇文章主要介紹了
不用比较运算符及循环控制语句,判断int型的a、b两数的大小
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?看到這個題目的時候,我當時想到的,就是首先進行a-b,然后判斷最高的符號位是1還是0。。我想大家也都會想到這一點:
int max(int a, int b) {int max[2] = { a, b };return max[((a - b)&0x80000000) >> 31 ]; //與運算,將最高位的后面31位全部置為0,右移31位取出符號位 }?????? 上面代碼在一般情況下都能得出正確的結果,但是當a是int型的最小值,而b是int型的最大值的時,相減就會有越界,并且符號位丟失了。其實不用那么極端的例子,因為兩個不同符號的數,相減很容易越界。所以我在這個代碼的基礎上,先判斷a和b的符號位,增加限制(符號相同,就減,這樣安全,沒有問題;符號相反的話,如果a是正數,b是負數,直接得出最大值或最小值),于是就有了下面的代碼:
#include "stdio.h" #include "stdlib.h"int Min(int a,int b) //先判斷符號位,符號相同的時候,兩個數相減 {return (((a >> 31 == 0) && (b >>31==1)) | (((a >> 31)^(b >> 31))==0)&&(((a-b)>>31)==0))? b:a;//printf("%s\n",(((a >> 31 == 0) && (b >>31==1)) | (((a >> 31)^(b >> 31))==0)&&(((a-b)>>31)==0))?"a>=b":"a<b"); }int main(void) {int a=0x80000000; //int類型的最小值int b=0x7fffffff; //int類型的最大值printf("%d\n",Min(a,b));system("pause");return 0; }
?
總結
以上是生活随笔為你收集整理的不用比较运算符及循环控制语句,判断int型的a、b两数的大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getchar、scanf以及缓冲区的概
- 下一篇: char str[] 和 char *s