系统标准最大数据类型为64位时能否用__int128存储128位无符号值
128位非零元计数变量选型与
__int128可用性解答 - 你测得
uintmax_t、intmax_t宽度为8字节是正常现象,这两个是C标准规定的「标准定义的最大宽度整数类型」,只覆盖C标准明文规定的整数类型,不包含编译器提供的私有扩展整数类型,这个结果完全不能用来判断__int128是否可用。 - 只要你使用GCC、Clang等主流编译器,且编译目标是64位架构(x86_64、arm64等),哪怕
uintmax_t是8字节,__int128系列扩展类型都可以正常使用。注意你需要存储的是128位无符号值,要选unsigned __int128而不是带符号的__int128——带符号版本最高位为符号位,最大值仅为2127-1,无法覆盖你需要的0~2128-1的全范围取值。 unsigned __int128支持所有常规整数运算(加减乘除、位运算、比较运算等),完全满足你计算、存储矩阵非零元素总数的需求,使用时只需要注意两个限制:- 标准库的
printf、scanf等默认IO函数不支持直接读写__int128类型值,如果需要打印计数结果,可以自己实现简单的128位整数转字符串逻辑,或者拆分高64位、低64位分别输出。 - 32位编译目标下编译器一般不提供
__int128支持,只要你编译时选择64位目标架构即可正常使用,不需要额外链接依赖。
- 标准库的
- 如果你的代码要求严格兼容C标准、不能依赖编译器扩展,也不需要引入复杂的大整数库:你要做的只是两个64位数相乘、累加计数,自己写一个包含两个
uint64_t成员(分别存高64位、低64位)的结构体,实现对应的乘法、加法逻辑即可,代码量非常小。
你测试系统最大标准类型宽度的代码参考如下:
#include <stdio.h> #include <stdint.h> int main() { printf("maxUInt: %lu\n", sizeof(uintmax_t)); printf("maxInt: %lu", sizeof(intmax_t)); }
对应运行输出:
maxUInt: 8 maxInt: 8
内容的提问来源于stack exchange,提问作者stht55
相关产品推荐
相关产品推荐

