c++-C++中宏定义比较两个数的大小

问题描述

C++中宏定义比较两个数的大小

#include
#define max(a,b) ((((long int)((a)-(b)))&0x80000000)?b:a)
void main()
{
int t,a,b;
cout<<"output a,b"<
cin>>a,b;
t=max(a,b);
cout<<t<<endl;
}为什么运行结果老是a的值?

解决方案

((((long int)((a)-(b)))&0x80000000)?b:a) /* 这是通过判断符号位进行大小判断 */
运行下看看吧
1-3 = -2;
我开始以为可能和64bit 32bit有关,
64位机器(long int)-2的计算机二进制对应十六进制表示是0xfffffffffffffffe
32位机器(long int)-2的计算机二进制对应十六进制表示是0xfffffffe
两者和0x80000000相与运行的效果都是相同的,结果为1,所以最大值为b,即是3

这两者都是没有关系的 算出来的结果都是正确的。
我对你的源码略做修改,因为你的源码我运行的比较乱。
#include

#define max(a,b) ((((long int)((a)-(b)))&0x80000000)?b:a)

using namespace std;

int main()
{
int t,a,b;
cout << "output a,b" << endl;
cin >>a >> b;
t = max(a, b);
cout<<t<<endl;
return 0;
}

解决方案二:

Thank you very much.

时间: 2025-01-01 23:12:33

c++-C++中宏定义比较两个数的大小的相关文章

C语言中宏定义使用的小细节_C 语言

#pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和 C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para.............etc.. baike.baidu.com/view/1451188.htm

javascript中比较两个数的大小,为什么有的数可以,有的不可以,新手 求指教

问题描述 javascript中比较两个数的大小,为什么有的数可以,有的不可以,新手 求指教 代码:<br> var a=prompt("请输入第一个数",0);<br> var b=prompt("请输入第二个数",0); </p> <p>function Max(c,d)<br> {<br> if(c > d) </p> <p>{ <br> aler

c++-关于win32 api中宏定义有一处不理解

问题描述 关于win32 api中宏定义有一处不理解 #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 这段代码我知道:宏定义,用KEYDOWN(vk_code)替代((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 但是不可思议的来了,它直接这样写: KEYDOWN(VK_UP) 我可以理解这是什么意思,就是说((GetAsyncKeyState(VK_

c/c++中宏定义##连接符 和#符的使用

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号.比如下面代码中的宏:#define WARN_IF(EXP)    do{ if (EXP)    fprintf(stderr, "Warning: " #EXP &

C++中宏定义和内联函数区别

一.宏定义和内联函数的区别 1. 宏定义不是函数,但是使用起来像函数.预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率.     内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while.switch,并且内联函数本身不能直接调用自身.如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数. 2. 宏定义是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换     内联函数则是在编译的时候进行代码

比较两个数的大小

因为 $$\log_25>\log_24=2>e^\frac{1}{2}$$ 所以 $$\log_52=\frac{1}{\log_25}<e^{-\frac{1}{2}}.$$

宏定义中的##操作符和... and _ _VA_ARGS_ _

1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co

Objective-C 宏定义详细介绍_IOS

喜欢读一些开源项目源码的人,总是会发现,大神的代码中总是有那么一些简短而高效的宏定义,点击进去一看,发现晦涩难懂,别说学习了,有时候理解都是一种困难,但是宏定义本身并没有那么难,但是写出一个好的宏当然还是需要丰富的经验和技术,接下来就说一说宏定义,看懂大神的宏是第一步,偶尔写一个也是装逼的好办法- 定义: 宏定义分为两种:一种是对象宏(object-like macro)另一种就是函数宏(function-like macro) 根据名字也可以理解到,对象宏就是用来定义一个量,通过这个宏可以拿到

c-用C语言实现在键盘输入两个十进制数,然后在屏幕输出这两个数中较大的那个数

问题描述 用C语言实现在键盘输入两个十进制数,然后在屏幕输出这两个数中较大的那个数 我是这样写的: #include #include void main() { scanf("%d,%d",&a,&a,&b); c=max(a,b); print("max=%d",c); return 0; } 可是怎么就不对了呢?想不明白..啊-- 解决方案 1;如wolf所说,多一个&a,多return 0; 2;a,b,c没定义 3;我记得标