意外的输出打印长号

时间:2015-12-29 15:16:40

标签: c# c++ mingw long-integer 32-bit

尝试在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);

我得到了这个:

enter image description here

C#输出很好。

此:

long n = 5330111323L;
    Console.WriteLine(n);

打印:

5330111323

两者都使用32位编译器。为什么我得到这个C ++输出?

5 个答案:

答案 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