_int 64和long long

本文详细介绍了在C++中如何处理大于40亿的大整数,包括使用__int64与unsigned__int64类型的范围、运算及输入输出方法,并对比了VC6.0与g++编译器的不同扩展方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-231,231),即-21474836482147483647。而unsigned范围是[0,2^32),即04294967295。也就是说,常规的32位整数只能够处理40亿以下的数。

那遇到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要,下面仅介绍VC6.0与g++编译器的扩展。
VC6.0的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 263)与[0,264),即-92233720368547758089223372036854775807与018446744073709551615(约1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:

1 __int64 a;
2 cin >> a;
3 cout << a;

那么,在第2行会收到“error C2679: binary ‘>>’ : no operator defined which takes a right-hand operand of type ‘__int64’ (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: ‘operator <<’ is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:

scanf("%I64d",&a);
printf("%I64d",a);
就可以正确输入输出了。当使用unsigned __int64时,把"I64d"改为"I64u"就可以了。
OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long 与 unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用

1long long a;
2cin>>a;
3cout<<a;
也可以使用

scanf("%lld",&a);
printf("%lld",a);

使用无符号数时,将"%lld"改成"%llu"即可。
最后再说明两点点:

1、作为一个特例,如果你使用的是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。

2、注意:__int64是两个短的下划线

转载自:http://www.cnitblog.com/cockerel/archive/2006/08/16/15356.html

<think>好的,用户想了解__int128long long int的区别。首先,我需要确认自己对这两个数据类型的理解是否正确。 首先,long long int是C/C++中的标准整数类型,通常占64,范围从-2^63到2^63-1。而__int128是GCC扩展提供的128整数类型,范围更大,但并不是标准的一部分,只能在支持GCC的编译器中使用。 接下来,我应该分几个方面来比较它们。首先是存储大小范围,然后是编译器支持,接着是使用场景,可能还要提到输入输出的处理方式,以及运算效率的问题。 在存储范围方面,long long64,而__int128是128,所以后者能表示的数值大很多。不过用户需要注意,不是所有编译器都支持__int128,比如MSVC可能不支持,而GCCClang支持。 使用场景的话,long long适用于需要大整数但不需要超过64的情况,而__int128用于需要极大整数的计算,比如大数运算或加密算法,但要注意可移植性,因为它是非标准的。 另外,处理输入输出时,__int128可能需要自己写函数来转换,因为标准库函数如printf不支持直接输出__int128的值。这时候用户需要自己实现将128数转换为字符串的方法。 运算效率方面,128的运算可能比64慢,尤其是在没有硬件支持的平台上,可能会用软件模拟,影响性能。这点在高性能计算中需要注意。 用户可能想知道在什么情况下应该使用哪种类型,所以需要强调如果不需要超过64的范围,优先使用long long,因为兼容性更好。只有在确实需要处理非常大的数,并且环境支持时,才考虑__int128。 另外,可能用户对如何检测编译器是否支持__int128有疑问,可以提到通过预处理器指令来判断,比如#ifdef __SIZEOF_INT128__。 最后,是否还有遗漏的点?比如,__int128通常是有符号的,而可能有unsigned __int128的存在,但这也取决于编译器支持。同时,C++标准库中的类型如int64_t是对应long long的,而128类型没有标准定义。 总结下来,需要分点说明两者的区别,并给出使用建议,确保用户能清楚了解各自的优缺点适用场景。</think>__int128 long long int 的区别主要体现在以下几个方面: --- ### 1. **存储空间与范围** | 类型 | 数 | 范围(有符号) | |----------------|--------|------------------------------------------------------------------------------| | `long long int` | 64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2^63 ~ 2^63-1) | | `__int128` | 128 | -170,141,183,460,469,231,731,687,303,715,884,105,728 ~ <br>170,141,183,460,469,231,731,687,303,715,884,105,727 (-2^127 ~ 2^127-1) | --- ### 2. **编译器支持** - **`long long int`** 是C/C++标准(C99/C++11及更高版本)中定义的标准类型,所有现代编译器均支持(如GCC、Clang、MSVC等)。 - **`__int128`** 是GCC/Clang的扩展类型,**非标准**,仅在部分编译器(如GCC、Clang)中支持,MSVC不支持。 --- ### 3. **典型使用场景** - **`long long int`** 适用于需要较大整数但不超过64的场景(如时间戳、大数计算等),兼容性强。 - **`__int128`** 适用于需要超大规模整数计算的场景(如加密算法、高精度数值模拟),但需注意代码可移植性。 --- ### 4. **输入输出限制** - **`long long int`** 可直接使用`%lld`或`%llu`格式化输入输出: ```cpp long long x; scanf("%lld", &x); printf("%lld", x); ``` - **`__int128`** 无标准库的格式化支持,需手动转换为字符串或分段处理: ```cpp void print(__int128 x) { if (x < 0) putchar('-'), x = -x; if (x > 9) print(x / 10); putchar(x % 10 + '0'); } ``` --- ### 5. **运算效率** - **硬件支持**:`long long int`的64运算通常有硬件直接支持,速度更快。 - **软件模拟**:`__int128`的128运算可能依赖软件模拟(尤其是32平台),性能较低。 --- ### 6. **代码示例对比** ```cpp // long long int 示例 long long a = 1e18, b = 1e18; long long sum = a + b; // 正确计算 // __int128 示例(仅限GCC/Clang) __int128 x = (__int128)1e36, y = (__int128)1e36; __int128 z = x + y; // 正确存储更大数值 ``` --- ### **总结建议** - 优先使用 `long long int`,除非需要超过64整数。 - 若使用 `__int128`,需确保代码仅在支持它的编译器中运行,并自行处理输入输出。 - 对于需要跨平台兼容的代码,避免使用 `__int128`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值