On 12月8日, 下午10时46分, ptkmar...@gmail.com wrote:
> On Dec 8, 9:35 am, James Fang <fangshang...@gmail.com> wrote:
>
>
>
> > Thanks for your correction...
>
> > int get_max(int a,int b)
> > {
> > int array[2];
> > array[0]=a;
> > array[1]=b;
> > return array[( (a-b)& (UINT_MAX/2+1U) ) >>
> > ((sizeof(int)*
-1)];}
>
> > int main()
> > {
> > printf("%d\n",get_max(-190,-100));
> > printf("%d\n",get_max(10000,100));
> > printf("%d\n",get_max(99,199));
>
> > }
>
> Still wrong. With your code,
> printf("%d
> \n",get_max(2147483647,-1));
> will print -1 as the answer.
>
> Your entire attempt is stupid, and the OP's requirement
> is stupid. Your whole attempt is pointless,
> and encourages stupid programming.
You are right, I omitted the overflow condition in the code, and it
can be workarounded as follow:
int get_max(int a,int b)
{
long long divisor = (long long)a-(long long)b;
int array[2];
array[0]=a;
array[1]=b;
return array[( divisor & (ULLONG_MAX/2+1U) ) >> ((sizeof(long
long)*

-1)];
}
As far as I am concerned, this question is rather an excersice than
what will be used in the real engineering environment. It forces the
coder to implement an "if(a<b){....}" expression with high level
programming language C rather than the compiler generated assembly.
In the assembly we can get the value of the status-register, which
will help us know the overflow in the last caculation. but with pure C
it is hard to get this valuable information(if I am wrong please
correct me).So it's impossible to implement a perfect "if(a<b){...}"
without knowing the processor details. And it's impossible for a
program caring the processor details be portable!
If we see the question as an excersice for "if(a<b){....}" and an
interesting puzzle, it is worthwhile to have a try and have some fun.
The "if(a>b){return a;}..." like impl is surely not stupid for the
real-world engineering, but it is surely not a clever answer for a
puzzle, right?
Anyway, I am with this answer just because that I am with this sounds-
interesting-question, not means that I support this kind of coding
standard in the project. I take your point that in engineering
practice, simply is the best.
BTW, is there any perfect solution to implement the "if(a<b){....}"
without any Relational Operator?