(1)long long 整型

    与C++98相比,C++11整型的最大变化是多了 long long 类型。但本来 long long 类型就离C++很近,早在1995就被提议写入C++98,却被C++委员会拒绝,后来 long long 类型进入了C99标准,也被很多编译器支持。于是C++标准委员会又掉头将 long long 纳入 C++11标准。

    long long 分两种类型:long long 和 unsigned long long。在C++11中,long long 整型被要求在不同平台上有不同的长度,但至少有64位。写常数时可以加LL(或ll)后缀标识一个 long long 类型的量。而ULL(或者ull、Ull、uLL)表示一个 unsigned long long 类型的字面量。比如:

    long long int lli = -9000000000000000000LL;
    unsigned long long int ulli = 9000000000000000000ULL;

    要查询具体某个平台上的 long long 类型的最大值和最小值,可以用以下代码:

    void CppBase::PrintLongLongTypeMinMaxValue() {

    long long llmin = LLONG_MIN;
    long long llmax = LLONG_MAX;
    unsigned long long ullmax = ULLONG_MAX;

    1. printf("---------- C format out ----------\r\n"); <br />printf("long long min : %lld\r\n", llmin); <br />printf("long long max : %lld\r\n", llmax); <br />printf("unsigned long long man : %llu\r\n", ullmax);<br /> <br />std::cout << std::endl << "---------- C++ format out ----------" << std::endl; <br />std::cout << "long long min : " << llmin << std::endl; <br />std::cout << "long long max : " << llmax << std::endl; <br />std::cout << "unsigned long long max : " << ullmax << std::endl;

    }

    PrintLongLongTypeMinMaxValue() 函数输出如下:
    C  11新特性系列(二)(long long 类型) - 图1

    (2)扩展整型

    通常在看很多项目的代码时,会发现一些整型的名字,比如 UINT,__int16,int64_t 等等。这些类型有的源自编译器的自行扩展,有的则是来自某些编程环境(比如工作在 linux 内核代码中)。事实上,C++11中一共只定义了5种标准的有符号整型

    • signed char
    • short int
    • int
    • long int
    • long long int

    标准同时规定,每一种有符号整型都有一种对应的无符号整型数,并且有符号整形和对应的无符号整型具有相同的存储空间大小,比如 int 和 unsigned int 存储究竟大小相同。

    在实际编程中,这5种整形适用性有限,所以有时编译器出于需要,会自行扩展一些整型。在C++11中,标准对这样的扩展做出了一些规定。对于标准整型外,允许编译器扩展自有整型,这些扩展整型的长度可以比最长的标准整型(long long int,通常是64位)还长,也可以介于两个标准整型的位数之间。比如在128位架构上,编译器可以定义一上扩展整形来对应128位的整数;而在一些嵌入式平台上,也可以根据需要扩展出48位的整型;不过C++11标准并没有对扩展整型的名称有任何的规定和建议,只是对扩展整型的使用规则做了一定的限制。

    简单地说,C++11规定,扩展整型必须和标准类型一样,有符号有对应的无符号版本,并且拥有相同的大小空间。但需要注意的是,当两个长度一样的整数进行运算时,C++会进行隐式类型转换,比如:

    int a = 5;
    long long b = 27;
    a + b
    上术代码中,a 和 b 类型不一样,在做 a + b 运算时,首先会把 a 转换成 long long 类型后,再和 b 做加法运算,这样 a 就产生了类型提升。

    无论是标准整型,还是扩展整型,转换的规则是由 “等级(rank)” 决定的。通常情况下有如下原则:

    • 长度越大的整型等级越高,比如 long long 就会比 int 等及高。
    • 长度相同的情况下,标准整型的等级高于扩展等级,比如 long long int 和 _int64 ,如果都是64位,则 long long int 等级高于 _int64 。
    • 相同大小的有符号类型和无符号类型等级相同,比如 long long int 和 unsigned long long 等级类型相同。

    进行隐式转换时,一般的原则是低等级整型转换了高等级整型,有符号转换为无符号。这种转换规则跟C98整型转换规则保持一致。

    更多精彩内容,敬请期待“电脑手机小能手”下期。