C++ Builder 整型变量和整型常量

C++ Builder 参考手册 ➙ C++ Builder 整型变量和整型常量


  • 标准 C / C++ 整型变量
  • 扩展 C / C++ 整型变量
  • 标准 C / C++ 整型常量
  • 扩展 C / C++ 整型常量
  • 标准 整型变量
  • 标准 整型常量值
  • Windows API 整型变量
  • C++ Builder 扩展整型变量
  • C++ Builder 整型异常

一. 标准 C / C++ 整型变量

变量类型 说明 取值范围
int 有符号整型变量,16 / 32 位〖注1〗 -2147483648 ~ 2147483647
signed int 有符号整型变量,16 / 32 位〖注1〗 -2147483648 ~ 2147483647
unsigned int 无符号整型变量,16 / 32 位〖注1〗 0 ~ 4294967295
char 8 位整型变量,有符号 / 无符号〖注2〗 -128 ~ 127
signed char 有符号 8 位整型变量〖注2〗 -128 ~ 127
unsigned char 无符号 8 位整型变量,有符号 / 无符号〖注2〗           0 ~ 255
short 有符号 16 位整型变量 -32768 ~ 32767
signed short 有符号 16 位整型变量 -32768 ~ 32767
unsigned short 无符号 16 位整型变量 0 ~ 65535
long 有符号 32 位整型变量 -2147483648 ~ 2147483647
signed long 有符号 32 位整型变量 -2147483648 ~ 2147483647
unsigned long 无符号 32 位整型变量 0 ~ 4294967295
long long 有符号 64 位整型变量 -9223372036854775808 ~ 9223372036854775807
signed long long 有符号 64 位整型变量 -9223372036854775808 ~ 9223372036854775807
unsigned long long 无符号 64 位整型变量 0 ~ 18446744073709551615

〖注1〗提到整型变量,首先会想到 int 类型。int 类型在不同平台的字节数不同,Win32 和 Win64 是 32 位的。如果需要跨平台,需要确定 16 位或 32 位需要用 short 和 long 类型。
〖注2〗由于 char 类型在不同的平台里面,可能是有符号整数 (x86/x64),也可能是无符号整数 (ARM/PowerPC)。大多数编译器里面的 char 都是 8 位的整数,虽然 C / C++ 标准里面没有规定 char 的位数,但是说明了 char 必须支持 UTF-8 编码 (C++ 14),那么 char 就应该是 8 位整数。

二. 扩展 C / C++ 整型变量

很多编译器都有这些扩展的整型变量,C++ Builder 也支持这些类型:

变量类型 说明 取值范围
__int8 8 位整型变量 -128 ~ 127
signed __int8 8 位整型变量 -128 ~ 127
unsigned __int8 8 位整型变量 0 ~ 255
__int16 16 位整型变量 -32768 ~ 32767
signed __int16 16 位整型变量 -32768 ~ 32767
unsigned __int16 16 位整型变量 0 ~ 65535
__int32 32 位整型变量 -2147483648 ~ 2147483647
signed __int32 32 位整型变量 -2147483648 ~ 2147483647
unsigned __int32 32 位整型变量 0 ~ 4294967295
__int64 64 位整型变量 -9223372036854775808 ~ 9223372036854775807
signed __int64 64 位整型变量 -9223372036854775808 ~ 9223372036854775807
unsigned __int64 64 位整型变量 0 ~ 18446744073709551615
__int128 128 位整型变量〖注3〗 〖注4〗
signed __int128 128 位整型变量〖注3〗 〖注4〗
unsigned __int128 128 位整型变量〖注3〗       〖注5〗

〖注3〗Win32 不支持,Win64 支持
〖注4〗取值范围 -170141183460469231731687303715884105728 ~ 170141183460469231731687303715884105727
〖注5〗取值范围 0 ~ 340282366920938463463374607431768211455

三. 标准 C / C++ 整型常量

1. 整型常量

  • 十进制整型常量:数字 1 ~ 9 开头,接下来是 0 ~ 9 的数字,例如 12345,800000 等。前面可以有正负号,表示正数或负数,例如 -128,+65 等。要注意数字 0 开头的数字是八进制数,不是十进制数。0 本身无所谓几进制,都是等于 0 的。
  • 十六进制整型常量:0x 或 0X 开头,接下来是 0 ~ 9 或 A ~ F / a ~ f 的数字或字母。例如 0x12,0xAB01 等。
  • 八进制整型常量:数字 0 开头,接下来是 0 ~ 7 的数字,例如 012,0765 等。
  • 二进制整型常量:0b 或 0B 开头,接下来是 0 ~ 1 的数字,例如 0B1010101111001101,0b1111 等。C++ Builder 的 clang 编译器支持这样的常量。以前一直是 C++ 扩展常量,一直到 C++ 14 才定为标准。

2. 整型常量的后缀

C / C++ 整型常量的后缀可以表示是否有符号和位数

后缀 类型 说明
u unsigned int 无符号整数,例如 50000u
U unsigned int 无符号整数,例如 50000U
l long 长整数,例如 123456l,0x1234abcdl
L long 长整数,例如 123456L,0X1234ABCDL
ul unsigned long 无符号长整数,例如 800ul,0x7890ul
UL unsigned long 无符号长整数,例如 800UL,0X7890UL
ll long long 64位长整数,例如 123ll,0x1234ll
LL long long 64位长整数,例如 123LL,0x1234LL
ull unsigned long long 无符号位64长整数,例如 12ull,0xfull
ULL unsigned long long 无符号位64长整数,例如 12ULL,0xFULL

四. 扩展 C / C++ 整型常量

后缀 类型 例子
i8 __int8 120i8,0x12i8
I8 __int8 60I8,0x60i8
ui8 unsigned __int8 210ui8,0xAAui8
UI8 unsigned __int8 200UI8,0xDDUI8
i16 __int16 1234i16,0x1abci16
I16 __int16 4567I16,0X1234I16
ui16 unsigned __int16 43210ui16,0xabcdui16
UI16 unsigned __int16 33333UI16,0XDCBAUI16
i32 __int32 11111i32,0x123i32
I32 __int32 22222I32,0x456I32
ui32 unsigned __int32 33333ui32,0X7890ui32
UI32 unsigned __int32 44444UI32,0x8765UI32
i64 __int64 567890i64,0xAAAAi64
I64 __int64 654321I64,0xccccI64
ui64 unsigned __int64 88888ui64,0x1234Aui64
UI64 unsigned __int64 99999UI64,0x4567fui64
i128 __int128 55555i128,0xfedcbai128
I128 __int128 66666I128,0xe1234i128
ui128 unsigned __int128 77777ui128,0x1abcui128
UI128 unsigned __int128 88888UI128,0x987ui128

五. 标准 整型变量

如果要跨平台,C++ 标准建议使用 里面的整数变量类型:

  • 是新版本头文件,老版本头文件是
  • 里面的类型在 std 命名空间里面
类型 说明
int8_t 8位整型
int16_t 16位整型
int32_t 32位整型
int64_t 64位整型
uint8_t 8位无符号整型
uint16_t 16位无符号整型
uint32_t 32位无符号整型
uint64_t 64位无符号整型
int_fast8_t 至少8位的访问速度最快的整型
int_fast16_t 至少16位的访问速度最快的整型
int_fast32_t 至少32位的访问速度最快的整型
int_fast64_t 至少64位的访问速度最快的整型
uint_fast8_t 至少8位的访问速度最快的无符号整型
uint_fast16_t 至少16位的访问速度最快的无符号整型
uint_fast32_t 至少32位的访问速度最快的无符号整型
uint_fast64_t 至少64位的访问速度最快的无符号整型
int_least8_t 至少8位的最小的整型
int_least16_t 至少16位的最小的整型
int_least32_t 至少32位的最小的整型
int_least64_t 至少64位的最小的整型
uint_least8_t 至少8位的最小的无符号整型
uint_least16_t 至少16位的最小的无符号整型
uint_least32_t 至少32位的最小的无符号整型
uint_least64_t 至少64位的最小的无符号整型
intmax_t 最大位数的整型
uintmax_t 最大位数的无符号整型
intptr_t 在32位程序里面是32位整型,在64位程序里面是64位整型,
是适合于储存指针 (地址) 或句柄的整型
uintptr_t 在32位程序里面是32位无符号整型,在64位程序里面是64位无符号整型,
是适合于储存指针 (地址) 或句柄的无符号整型
  • 是新版本头文件,老版本头文件是
  • 里面的类型在 std 命名空间里面
类型 说明
size_t 无符号整数,sizeof 的返回值的类型,占用内存空间字节数
ptrdiff_t 有符号整数,两个指针 (内存地址) 相减得到的有符号整数的类型

六. 标准 整型常量值

常数值 说明
INT8_MIN int8_t 最小值 -128
INT16_MIN int16_t 最小值 -32768
INT32_MIN int32_t 最小值 -2147483648
INT64_MIN int64_t 最小值 -9223372036854775808
INT8_MAX int8_t 最大值 127
INT16_MAX int16_t 最大值 32767
INT32_MAX int32_t 最大值 2147483647
INT64_MAX int64_t 最大值 9223372036854775807
UINT8_MAX uint8_t 最大值 255
UINT16_MAX uint16_t 最大值 65535
UINT32_MAX uint32_t 最大值 4294967295
UINT64_MAX uint64_t 最大值 18446744073709551615
INT_LEAST8_MIN int_least8_t 最小值 -128
INT_LEAST16_MIN int_least16_t 最小值 -32768
INT_LEAST32_MIN int_least32_t 最小值 -2147483648
INT_LEAST64_MIN int_least64_t 最小值 -9223372036854775808
INT_LEAST8_MAX int_least8_t 最大值 127
INT_LEAST16_MAX int_least16_t 最大值 32767
INT_LEAST32_MAX int_least32_t 最大值 2147483647
INT_LEAST64_MAX int_least64_t 最大值 9223372036854775807
UINT_LEAST8_MAX uint_least8_t 最大值 255
UINT_LEAST16_MAX uint_least16_t 最大值 65535
UINT_LEAST32_MAX uint_least32_t 最大值 4294967295
UINT_LEAST64_MAX uint_least64_t 最大值 18446744073709551615
INT_FAST8_MIN int_fast8_t 最小值 -128
INT_FAST16_MIN int_fast16_t 最小值 -32768
INT_FAST32_MIN int_fast32_t 最小值 -2147483648
INT_FAST64_MIN int_fast64_t 最小值 -9223372036854775808
INT_FAST8_MAX int_fast8_t 最大值 127
INT_FAST16_MAX int_fast16_t 最大值 32767
INT_FAST32_MAX int_fast32_t 最大值 2147483647
INT_FAST64_MAX int_fast64_t 最大值 9223372036854775807
UINT_FAST8_MAX uint_fast8_t 最大值 255
UINT_FAST16_MAX uint_fast16_t 最大值 65535
UINT_FAST32_MAX uint_fast32_t 最大值 4294967295
UINT_FAST64_MAX uint_fast64_t 最大值 18446744073709551615
INTPTR_MIN intptr_t 最小值 -9223372036854775808 或 -2147483648
INTPTR_MAX intptr_t 最大值 9223372036854775807 或 2147483647
UINTPTR_MAX uintptr_t 最大值 18446744073709551615 或 4294967295
INTMAX_MIN intmax_t 最小值 -9223372036854775808
INTMAX_MAX intmax_t 最大值 9223372036854775807
UINTMAX_MAX uintmax_t 最大值 18446744073709551615
PTRDIFF_MIN ptrdiff_t 最小值 -9223372036854775808 或 -2147483648
PTRDIFF_MAX ptrdiff_t 最大值 9223372036854775807 或 2147483647

七. Windows API 整型变量

类型 说明
CHAR 字符类型 char
INT8 有符号的8位整数 signed char
UCHAR 无符号的字符类型 unsigned char
UINT8 无符号的8位整数 unsigned char
BYTE 字节 unsigned char
SHORT 有符号短整数 short
INT16 有符号的16位整数 signed short
USHORT 无符号的短整数 unsigned short
UINT16 无符号的16位短整数 unsigned short
WORD 字 unsigned short
INT 整数 int
INT32 有符号的整数 signed int
UINT 无符号的整数 unsigned int
UINT32 无符号的32位整数 unsigned int
LONG 有符号的长整数 long
ULONG 无符号的长整数 unsigned long
DWORD 双字 unsigned long
LONGLONG 有符号的长的长整数 __int64
LONG64 有符号的64位的长整数 __int64
INT64 有符号的64位整数 signed __int64
ULONGLONG 无符号的长的长整数 unsigned __int64
DWORDLONG 四字 unsigned __int64
ULONG64 无符号的64位整数 unsigned __int64
DWORD64 四字 unsigned __int64
UINT64 无符号的64位整数 unsigned __int64
INT_PTR 有符号的适合储存指针 (地址) 的整数 intptr_t
UINT_PTR 无符号的适合储存指针的整数 uintptr_t
LONG_PTR 有符号的适合储存指针 (地址) 的整数 intptr_t
ULONG_PTR 无符号的适合储存指针的整数 uintptr_t
DWORD_PTR 无符号的适合储存指针的整数 uintptr_t
SSIZE_T 有符号的整数,和 size_t 位数相等
SIZE_T 无符号的整数,size_t

八. C++ Builder 扩展整型变量

类型 说明
NativeInt 兼容 Delphi 类型,C++ 类型为 intptr_t
NativeUInt 兼容 Delphi 类型,C++ 类型为 uintptr_t

九. C++ Builder 整型异常

C++ Builder 在处理整数的时候,只有被零除能够抛出异常:EDivByZero,其他情况,比如溢出了不抛出异常,高位丢失。

例1:溢出的例子

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    long x = 6789012;
    short d = x;
    unsigned char c = d;

    UnicodeString s;
    s.cat_sprintf(L"x = %ld\r\n", x);
    s.cat_sprintf(L"d = %d\r\n", d);
    s.cat_sprintf(L"c = %d\r\n", c);
    Memo1->Text = s;
}

运行结果:

溢出的例子的运行结果

十进制 6789012 等于十六进制 0x679794,
给 short 赋值的时候,高位丢失,剩下 0x9794,等于十进制 -26732,
给 unsigned char 赋值的时候,高位丢失,剩下 0x94,等于十进制 148。

例2:被零除的例子

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    try
    {
        int a = 100;
        int b = 0;
        int x = a / b;
        Memo1->Lines->Add(L"x = " + IntToStr(x));
    }
    catch(Exception &E)
    {
        Memo1->Lines->Add(E.ClassName());
        Memo1->Lines->Add(E.Message);
    }
}

运行结果:

整数被零除的例子的运行结果

运算 100 / 0 抛出整数被零除的异常 EDivByZero,异常的描述为 "Division by zero"。


相关:

  • C++ Builder 的枚举类型
  • C++ Builder 浮点型变量和浮点型常量
  • C++ Builder 的字符串类型、字符类型、字符编码

C++ Builder 参考手册 ➙ C++ Builder 整型变量和整型常量

你可能感兴趣的:(C++ Builder 整型变量和整型常量)