#include <stdio.h>
// 要求写的函数
int Min(int a, int b)
{
return (&b)[(a-b)>>31];
}
///其思想就是a,b的地址是在栈上连续分配的,而且数据类型一样。且b的地址高于a的地址
///如果(a-b)>>31那么右移31为就是其符号为,正为0,负为1,对于右移运算,有符号位的
///时,如果为负,则符号位补1。
//此题中,b的地址高于a的地址,若a>=b,那么(a-b)>>31为0,(&b)[0]实际上就是b,
//若a<b,则(a-b)>>31位为1000 0000 0000 0001,所以为-1。此时(&b)[-1]实际上就是a。
//所以能找出最小值。
// 测试代码
int main(void)
{
int a = 111;
int b = 114;
printf("The smaller one of %d and %d is %d\n", a, b, Min(a, b));
return 0;
}
摘自:http://blog.youkuaiyun.com/kingskyleader/article/details/6693500
相关知识:
1.程序的内存分配:堆,栈,全局常量区,字符常量区,程序代码区
2.程序中数据的内存分配是按以上5个区分区存放的。
3.栈是向低地址扩展的数据结构,是一块连续的内存的区域,大小已知的,WINDOWS下,栈的大小是2M。
堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,
而链表的遍历方向是由低地址向高地址。
3.在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,
在VC6.0++编译器中,函数参数是由右往左入栈的