【问题标题】:windows uses long int as if in a 32-bit machine while in 64-bit [duplicate]Windows 使用 long int 就像在 32 位机器中一样,而在 64 位 [重复]
【发布时间】:2021-10-15 19:13:55
【问题描述】:

我使用的是 10 64 位。 例如,当运行以下代码时,我得到一个溢出并打印一个负数,而在 linux 64 机器上我得到打印的实际数字:

#include <stdio.h>

int main() {
    long int a = 3845354610;
    printf("Hello, World!%ld\n", a);
    scanf("%ld", &a);
    return 0;
}

windows 上的输出是:

Hello, World!-449612686

在 linux 上它是正确的输出。

我尝试在 CLion 的 CMake 选项中使用 --build-64bit 标志。我正在使用mingw-64 (D:\MinGW\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64)。

我尝试使用cmd编译:

gcc -Wall -Wextra -Wvla -std=c99 main.c -o ma.exe

但是输出是一样的。如何解决这个问题?

【问题讨论】:

  • 3845354610 不适合有符号的 32 位整数。
  • 什么是printf("%zu\n", sizeof(long int));
  • @ArielYael 好吧,就是这样...... 4x8 = 32 位无法存储 3845354610
  • @ArielYael “互联网上说应该是 64”在哪里?
  • 32 位 MSVC 使用 32 位指针,64 位 MSVC 使用 64 位指针(与 GCC 相同)。但 MSVC 保留 32 位 int long。是允许的。

标签: c++ c 64-bit overflow long-integer


【解决方案1】:

如何解决这个问题?

通过使用long longstd::int64_tlong 是必需的/保证至少为 32 位,这就是(64 位)窗口上 long 的大小。

【讨论】:

  • 为什么this 网站声明在 64 位上的大小应该更大?
  • @ArielYael 它没有说明这样的事情。它说:LONG_MAX - ANSI standard maximum magnitude value - ≥+2,147,483,647 有什么不清楚的地方?
  • @ArielYael 使用此处的表格并查看en.cppreference.com/w/cpp/language/types "Win64 API - LLP64 或 4/4/8(int 和 long 为 32 位,指针为 64 位) i>"
  • LONG_MAX 是什么意思 -> 64 位编译器 ->+9,223,372,036,854,775,807 那么呢?
  • @ArielYael 阅读专栏标题:“典型值”。 “典型”并不意味着“总是”或“保证”或“必需”。该页面的作者显然不认为 64 位 Window 的实现是典型的。
猜你喜欢
  • 2013-08-01
  • 2013-12-05
  • 2011-03-05
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多