尝试在32位计算机上用C ++打印long
。我收到了意想不到的结果。
从这段代码:
long n = 5330111323L;
printf("n = %ld\n", n);
printf("can print? %s\n", LONG_MAX < 5330111323L ? "yes" : "NO");
printf("LONG_MAX = %ld\n", LONG_MAX);
我得到了这个:
C#输出很好。
此:
long n = 5330111323L;
Console.WriteLine(n);
打印:
5330111323
两者都使用32位编译器。为什么我得到这个C ++输出?
答案 0 :(得分:2)
条件有误,应该是:
LONG_MAX > 5330111323L ? "yes" : "NO"
n
如果低于 LONG_MAX
,则可以(正确)打印,因为在所有情况下,n
都会低于或等于{{} 1}}如果LONG_MAX
已声明为n
。
编辑 :请注意,您也可以使用long
答案 1 :(得分:1)
在C#long
中是64位数据类型。在32位上编译它仍然是64位大小并不重要。在C ++中我们所知道的long
是它必须保持与int
一样多或更多,并且它至少是32位。如果你在c ++中使用long long
保证至少64位,这将与你在C#中的匹配。即使你用C ++编译32位,它也是64位。
答案 2 :(得分:1)
sizeof(long)
在任何地方都没有固定,甚至没有习惯性的&#39;它的大小,并且实际上不推荐使用此类型(每次使用long
时都会出现甚至发出错误的检查程序)。特别是,在您的系统上,很明显long
的大小为32位。
另一方面,long
(或此问题的任何其他非指针类型)的大小与32比64位模式无关。
在第三个注释中,您的检查在逻辑上是不正确的。你应该打印“是”&#39; LONG_MAX 大于时的数字。
答案 3 :(得分:0)
在C ++中,大到适合其原始类型的整数文字常量可以自动解释为更长的类型,即使它们具有错误的后缀。
#include <iostream>
int main(){
auto a=9876543210; // ‘L’ or ‘LL’ suffix missing.
int b=a; // Not even a warning
int c=9876543210; // warning: "implicit constant conversion", even without suffix!
std::cout << a << '\n' << b << '\n' << c << '\n';
}
答案 4 :(得分:0)
您如何看待,哪个更大5330111323(用户输入)或2147483647(LONG_MAX)?
您实际上是在尝试打印系统中长距离以外的值,这是对未定义行为的邀请。
BTW,改善你的计划中的以下条件。
event.preventDefault