【C++11新特性:18】—— C++11 long long超长整形详解

原文地址:http://c.biancheng.net/view/7809.html


C++ 11 标准中,基于整数大小的考虑,共提供了如表 1 所示的这些数据类型。与此同时,标准中还明确限定了各个数据类型最少占用的位数。

表 1 C++11标准中所有的整形数据类型
整数类型等价类型C++11标准规定占用最少位数
shortshort int(有符号短整型)至少 16 位(2 个字节)
signed short
signed short int
unsigned shortunsigned short int(无符号短整型)
unsigned short int
intint(有符号整形)至少 16 位(2 个字节)
signed
signed int
unsignedunsigned int(无符号整形)
unsigned int
longlong int(有符号长整形)至少 32 位(4 个字节)
long int
signed long
signed long int
unsigned longunsigned long int(无符号长整形)
unsigned long int
long long (C++11)long long int(有符号超长整形)至少 64 位(8 个字节)
long long int(C++11)
signed long long(C++11)
signed long long int(C++11)
unsigned long long(C++11)unsigned long long int(无符号超长整型)
unsigned long long int(C++11)

C++11 标准规定,每种整数类型必须同时具备有符号(signed)和无符号(unsigned)两种类型,且每种具体的有符号整形和无符号整形所占用的存储空间(也就是位数)必须相同。注意,C++11 标准中只限定了每种类型最少占用多少存储空间,不同的平台可以占用不同的存储空间。

在表 1 罗列的这些数据类型中,long long 超长整型是 C++ 11 标准新添加的,接下来就对该整数类型做具体的介绍。

说道 C++ 标准委员会将 long long 整形写入 C++ 11 标准中,其实早在 1995 年,就有人提议将 long long 整形写入 C++ 98 标准,但被委员会拒绝了。而后 long long 整形被 C99 标准(C语言标准之一)采纳,并逐渐被很多编译器支持,于是 C++ 标准委员会重新决定将 long long 整形写入 C++ 11 标准中。

如同 long 类型整数需明确标注 “L” 或者 “l” 后缀一样,要使用 long long 类型的整数,也必须标注对应的后缀:

  • 对于有符号 long long 整形,后缀用 “LL” 或者 “ll” 标识。例如,“10LL” 就表示有符号超长整数 10;
  • 对于无符号 long long 整形,后缀用 “ULL”、“ull”、“Ull” 或者 “uLL” 标识。例如,“10ULL” 就表示无符号超长整数 10;

如果不添加任何标识,则所有的整数都会默认为 int 类型。

对于任意一种数据类型,读者可能更关心的是此类型的取值范围。对于 long long 类型来说,如果想了解当前平台上 long long 整形的取值范围,可以使用<climits>头文件中与 long long 整形相关的 3 个宏,分别为 LLONG_MIN、LLONG_MAX 和 ULLONG_MIN:

  1. LLONG_MIN:代表当前平台上最小的 long long 类型整数;
  2. LLONG_MAX:代表当前平台上最大的 long long 类型整数;
  3. ULLONG_MIN:代表当前平台上最大的 unsigned long long 类型整数(无符号超长整型的最小值为 0);

举个例子:

#include <iostream>
#include <iomanip>
#include <climits>
using namespace std;
int main()
{
    cout <<"long long最大值:" << LLONG_MIN <<" "<< hex << LLONG_MIN <<"\n";
    cout << dec <<"long long最小值:" << LLONG_MAX << " " << hex << LLONG_MAX << "\n";
    cout << dec << "unsigned long long最大值:" << ULLONG_MAX << " " << hex << ULLONG_MAX;
    return 0;
}

程序执行结果为(不唯一):

long long最大值:-9223372036854775808 8000000000000000
long long最小值:9223372036854775807 7fffffffffffffff
unsigned long long最大值:18446744073709551615 ffffffffffffffff

关于整形在内存中到底是如何存储的,读者可阅读《整数在内存中是如何存储的,为什么它堪称天才般的设计》一节。

此程序中,输出了各最大值和最小值对应的十六进制,显然在当前平台(Windows10 64位操作系统)上,long long 超长整型占用 64 位(也就是 16 个字节)的存储空间。读者可自行在自己的机器上运行此段代码,即可轻松得知 long long 类型在自己机器上所占用的字节数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的bitset是一个模板类,用于表示和操作位集合。它提供了一种方便的方式来处理二进制数据,可以将一组位表示为整数值。 使用bitset,你可以: 1. 创建bitset对象:可以指定位数或使用默认位数(通常为32或64)来创建一个bitset对象。 ```cpp std::bitset<8> bits1; // 创建一个8位的bitset对象 std::bitset<16> bits2(0b1010101010101010); // 使用指定的二进制值来创建一个16位的bitset对象 std::bitset<32> bits3("10101010"); // 使用指定的字符串来创建一个32位的bitset对象 ``` 2. 访问和修改位:可以使用下标运算符[]来访问和修改位。 ```cpp std::bitset<8> bits(0b11001100); bool bit = bits[2]; // 获取第2位的值(1) bits[5] = 0; // 将第5位设置为0 ``` 3. 进行位操作:可以执行与、或、异或等位操作。 ```cpp std::bitset<8> bits1(0b11001100); std::bitset<8> bits2(0b10101010); std::bitset<8> result = bits1 & bits2; // 按位与操作 result = bits1 | bits2; // 按位或操作 result = bits1 ^ bits2; // 按位异或操作 ``` 4. 执行位集合操作:可以执行位的翻转、求反等操作。 ```cpp std::bitset<8> bits(0b11001100); bits.flip(); // 翻转所有位 bits.reset(); // 将所有位设置为0 bits.set(); // 将所有位设置为1 ``` 5. 获取位集合信息:可以获取位集合的大小、字符串表示、二进制表示等信息。 ```cpp std::bitset<8> bits(0b11001100); int size = bits.size(); // 获取位集合的大小(8) std::string str = bits.to_string(); // 获取位集合的字符串表示("11001100") unsigned long value = bits.to_ulong(); // 获取位集合的整数值(204) ``` 注意:bitset是固定度的,一旦创建就不能改变度。如果需要动态度的位集合,可以使用vector<bool>或自定义的数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值