宏类型的大小?
Size of macro type?
我想知道我可以在宏表达式中键入的最大数字是多少,直到它溢出。我写了下面的程序:
#define I (INT_MAX + 1)
#define J (LONG_MAX + 1)
int main()
{
cout << INT_MAX << I << endl;
cout << LONG_MAX << J << endl;
return 0;
}
我得到以下输出:
2147483647-2147483648
9223372036854775807-9223372036854775808
我不明白 int 情况下的溢出,如果它可以存储 LONG_MAX 的值。然后我想起宏也可以存储小数,例如3.14(PI),所以它应该是float类型。
我现在很困惑。请帮忙
宏没有类型。它们根本不与类型系统交互。宏是编译前执行的预处理步骤的一部分。宏是文本替换。你的源代码经过预处理后,编译器看到的结果如下:
int main()
{
cout << INT_MAX << (INT_MAX + 1) << endl;
cout << LONG_MAX << (LONG_MAX + 1) << endl;
return 0;
}
... 除了 INT_MAX
和 LONG_MAX
本身就是宏,所以它们也会作为预处理的一部分扩展为一些整数文字。确切的值是特定于实现的,并且可能因系统而异,所以我没有在这里扩展它们以使答案保持通用。
P.S。由于有符号溢出,程序的行为未定义。
我想知道我可以在宏表达式中键入的最大数字是多少,直到它溢出。我写了下面的程序:
#define I (INT_MAX + 1)
#define J (LONG_MAX + 1)
int main()
{
cout << INT_MAX << I << endl;
cout << LONG_MAX << J << endl;
return 0;
}
我得到以下输出:
2147483647-2147483648
9223372036854775807-9223372036854775808
我不明白 int 情况下的溢出,如果它可以存储 LONG_MAX 的值。然后我想起宏也可以存储小数,例如3.14(PI),所以它应该是float类型。 我现在很困惑。请帮忙
宏没有类型。它们根本不与类型系统交互。宏是编译前执行的预处理步骤的一部分。宏是文本替换。你的源代码经过预处理后,编译器看到的结果如下:
int main()
{
cout << INT_MAX << (INT_MAX + 1) << endl;
cout << LONG_MAX << (LONG_MAX + 1) << endl;
return 0;
}
... 除了 INT_MAX
和 LONG_MAX
本身就是宏,所以它们也会作为预处理的一部分扩展为一些整数文字。确切的值是特定于实现的,并且可能因系统而异,所以我没有在这里扩展它们以使答案保持通用。
P.S。由于有符号溢出,程序的行为未定义。