C++ Builder 參考手冊 ? C++ Builder 整型變量和整型常量
- 標準 C / C++ 整型變量
- 擴展 C / C++ 整型變量
- 標準 C / C++ 整型常量
- 擴展 C / C++ 整型常量
- 標準 <cstdint> 和 <cstddef> 整型變量
- 標準 <cstdint> 整型常量值
- 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 |
五. 標準 <cstdint> 和 <cstddef> 整型變量
如果要跨平臺,C++ 標準建議使用 <cstdint> 和 <cstddef> 里面的整數變量類型:
- <cstdint> 是新版本頭文件,老版本頭文件是 <stdint.h>
- <cstdint> 里面的類型在 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位無符號整型, 是適合于儲存指針 (地址) 或句柄的無符號整型 |
- <cstddef> 是新版本頭文件,老版本頭文件是 <stddef.h>
- <cstddef> 里面的類型在 std 命名空間里面
類型 | 說明 |
---|---|
size_t | 無符號整數,sizeof 的返回值的類型,占用內存空間字節數 |
ptrdiff_t | 有符號整數,兩個指針 (內存地址) 相減得到的有符號整數的類型 |
六. 標準 <cstdint> 整型常量值
常數值 | 說明 | 值 |
---|---|---|
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 整型變量和整型常量