C Windows 10/mingw-w64编译器上大小的最大值

C Windows 10/mingw-w64编译器上大小的最大值,c,mingw-w64,size-t,C,Mingw W64,Size T,我正在Windows 10(64位安装)上使用mingw-w64编译器(gcc 8.1.0)。我的期望是使size\u t的最大值等于(2^64-1)。但是我的程序总是将SIZE\u MAX的值返回为(仅限2^32-1)。原因可能是什么?如何在我的C程序中实现最大值(2^64-1) 我正在学习C语言,想看看书中的陈述,在现代计算机上,size\t的最大大小可以是(2^64-1)。我尝试检查这一点的代码如下: #include <stdio.h> #include <stdint

我正在Windows 10(64位安装)上使用mingw-w64编译器(gcc 8.1.0)。我的期望是使
size\u t
的最大值等于(2^64-1)。但是我的程序总是将
SIZE\u MAX
的值返回为(仅限2^32-1)。原因可能是什么?如何在我的C程序中实现最大值(2^64-1)

我正在学习C语言,想看看书中的陈述,在现代计算机上,
size\t
的最大大小可以是(2^64-1)。我尝试检查这一点的代码如下:

#include <stdio.h>
#include <stdint.h>

int main(){
    printf("%d\n", sizeof(size_t));
    printf("%zu\n", SIZE_MAX); 
    return 0;
}
在编译期间,我只使用了一个标志
-std=c11
,并且
gcc--version
返回:

gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0
当检查
gcc--version
时,说明您得到了

gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0
输出的重要部分是:
i686-posix-dwarf-rev0
,更具体地说是
i686
部分

这告诉我们GCC是作为32位应用程序构建的(i686是32位系统),默认情况下将创建32位可执行文件

要构建64位可执行文件,您需要添加
-m64
标志。

在选中
gcc--version
时,您声明

gcc.exe (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0
输出的重要部分是:
i686-posix-dwarf-rev0
,更具体地说是
i686
部分

这告诉我们GCC是作为32位应用程序构建的(i686是32位系统),默认情况下将创建32位可执行文件


要构建64位可执行文件,您需要添加
-m64
标志。

实际上没有任何东西表明它必须是64位无符号整数类型,只有它必须是无符号的。大小由实现定义。因此,请解释为什么需要将
size\u t
设置为64位值?你需要解决的真正问题是什么?那么你如何构建?您在构建时提供了哪些标志和选项?您确定使用了正确的编译器吗?如果运行
gcc--version
,它会告诉您正确的版本吗?你有你的测试计划的一部分可以给我们看吗?请编辑您的问题,将所有这些以及您刚才在评论中告诉我们的所有内容都包括在内。您显示的代码存在两个问题,都是您的格式说明符和类型不匹配(这会导致错误)。首先,要打印
大小\u t
值,需要使用
“%zu”
格式说明符。
z
前缀表示它是一个
size\u t
,而
u
前缀表示它是一个无符号值。第二个不匹配是
SIZE\u MAX
对于
int
格式
%u
可能太大。您应该使用
PRIu64
格式以确保可以打印,并将其强制转换为无符号64位类型(如
unsigned long
)。可能相关:@Someprogrammerdude“使用PRIu64格式以确保可以打印,并将其强制转换为无符号64位类型(如unsigned long long)”不是最佳建议。将
PRIu64
(uint64\u t)
一起使用时,
(unsigned long)
一起使用时会更好
(unsigned long-long)
现在通常是64位的,但可能更大。实际上,没有什么规定它必须是64位无符号整数类型,只是它必须是无符号的。大小由实现定义。因此,请解释为什么需要将
size\u t
设置为64位值?你需要解决的真正问题是什么?那么你如何构建?您在构建时提供了哪些标志和选项?您确定使用了正确的编译器吗?如果运行
gcc--version
,它会告诉您正确的版本吗?你有你的测试计划的一部分可以给我们看吗?请编辑您的问题,将所有这些以及您刚才在评论中告诉我们的所有内容都包括在内。您显示的代码存在两个问题,都是您的格式说明符和类型不匹配(这会导致错误)。首先,要打印
大小\u t
值,需要使用
“%zu”
格式说明符。
z
前缀表示它是一个
size\u t
,而
u
前缀表示它是一个无符号值。第二个不匹配是
SIZE\u MAX
对于
int
格式
%u
可能太大。您应该使用
PRIu64
格式以确保可以打印,并将其强制转换为无符号64位类型(如
unsigned long
)。可能相关:@Someprogrammerdude“使用PRIu64格式以确保可以打印,并将其强制转换为无符号64位类型(如unsigned long long)”不是最佳建议。将
PRIu64
(uint64\u t)
一起使用时,
(unsigned long)
一起使用时会更好
(unsigned long-long)
现在通常是64位,但可能更大。确定。问题是由于编译器是32位的。我把它改为64位,问题就解决了。谢谢,好的。问题是由于编译器是32位的。我把它改为64位,问题就解决了。谢谢