`
java-mans
  • 浏览: 11416039 次
文章分类
社区版块
存档分类
最新评论

不用比较运算符及循环控制语句,判断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;    
}



分享到:
评论

相关推荐

    C语言程序设计标准教程

    第四行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号, 因此输出的a,b值之间加了一个逗号。第六行的...

    C++复习资料之系列

    在下列选项中,全部都合法的浮点型数据的选项为( a,b,d ),全部都不合法的浮点型数据选项是( c )。 (a) -1e3 , 15. , 2e-4 (b) 12.34 , -1e+5 , 0.0 (c) 0.2e-2.5 , e-5 (d) 5.0e-4 , 0.1 , 8.e+2...

    Kotlin 基础语法.docx

    Kotlin 基础语法 包括变量、数据类型、运算符、控制流语句等内容。 变量:使用关键字var声明可变变量,使用关键字val声明不可变变量。 var a: Int = 10 val b: String = "Hello" 数据类型:Kotlin具有丰富的数据类型...

    《程序设计基础》作业.doc

    A int类型占用的字节数量 B 人为事先的约定和习惯 C 所存储的数据是否有符号 D 数在内存中的编码方式 5. C语言中,关于运算符的正确概念是( D )。 A 运算符具有优先级,同优先级的运算符由括号决定运算次序 B 在...

    虹软笔试题

    4:在C语言中,′a′和″a″存储所占用的字节数分别是 B A.1,1 B.1,2 C.2,1 D.2,2 5:设int a,*p;则语句p=&a;中的运算符“&”的含义是 D A.位与运算 B.逻辑与运算 C.取指针内容 D.取变量地址

    C#初学练习程序

    比较大小可以使用三目运算符 max = (a &gt; b) ? a : b; string a = Console.ReadLine(); int b = Int16.Parse(a); int b = int.Parse(a); 1、53页课后题5 2、用while循环完成课后题9题 编一个程序,输入0—100之间的...

    经典SQL语句大全

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right (outer) join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full/cross (outer...

    c++复习资料综合版本

    (A)1、C++规定,int、unsigned、short三种类型的数据在内存中所占的字节数分别是。 A.4,4,2 B.4,2,4 C. 2,4,4 D. 2,4,2 (A)2、关于各运算符的优先顺序,以下正确的选项是。 A. 单目运算符&gt;算术运算符&gt;关系...

    C语言常见错误小结,希望对大家有帮助

    前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。 5.忘记加分号。 分号是C语句中不可缺少的一部分,语句末尾必须有分号。 a=1 b=2 编译时,编译程序在...

    〖程序设计基础〗练习题2及答案

    15.设int 型变量 a、b,float 型变量 x、y,char 型变量 ch 均已正确定义并赋值, 正确的switch语句是( )。 A) switch (x + y) B) switch ( ch + 1 ) { ...... } { ...... } C) switch ch D) switch ( a + b ); { ....

    c0扩充编译器,实现三种优化,北航计算机

    语句> ::= 条件语句>|循环语句>|‘{’&lt;语句序列&gt;‘}’|子函数调用语句>; |赋值语句>; | &lt;返回语句&gt;;|读语句>;|写语句>;|空> 赋值语句> ::= 标识符>=表达式> 条件语句> ::= if‘(’条件>‘)...

    扩充C0编译器要求 北航计算机用

    语句> ::= 条件语句>|循环语句>|‘{’&lt;语句序列&gt;‘}’|子函数调用语句>; |赋值语句>; | &lt;返回语句&gt;;|读语句>;|写语句>;|空> 赋值语句> ::= 标识符>=表达式> 条件语句> ::= if‘(’条件>‘)...

    C#.Net基础3 基础入门知识 运算符 范例 ppt 实例 可以直接运行.rar

    但是,如果两个类型的变量不兼容,比如 string与int或者string 与double, 这个时候我们可以使用一个叫做Convert的转换工厂进行转换。 注意:使用Convert进行类型转换,也需要满足一个条件: 面儿上必须要过的去。 ...

    经典全面的SQL语句大全

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  B:right outer join:  右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。  C:full outer join: ...

    【03-流程控制与数组】

    •do while 循环语句里,即使test_expression循环条件的值开始是假,do while循环也会执行循环体。因此,  do while循环的循环体至少执行一次。 本文原创作者:pipi-changing 本文原创出处:...

    数据库操作语句大全(sql)

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right (outer) join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full/cross (outer...

    C语言自增自减运算符的区别与理解

    C语言自增运算符的置于变量前和变量后的区别与理解自加自减运算符的概念:在普通语句定义并用printf函数输出结果for循环中作为判断条件结语Reference 自加自减运算符的概念: 自增自减运算符存在于C/C++/C#/Java/...

    〖程序设计基础〗练习题3及答案

    4. 若a,b为int型变量且已分别赋值为2,4。表达式!(++a!=b--)的值是_________ 。 5.在Java语言中,将后缀名为_____的源代码编译后形成后缀名为______的字节码文件。 6.设有整型数组的定义:int a[]=new int[8]; ,则...

    c语言复习-有关于c语言的基础例题,仅供参考

    有关于c语言的基础例题,仅供参考 ...11. 判断一个数能被另一数整除如何表示? 提示:a%b! =0; 12. 二重循环的执行次数: for(int i=1;i;i++) for(int j=i;j;j++) a=1; 语句a=1;在二重循环中执行了多少次?

Global site tag (gtag.js) - Google Analytics