<stdint.h> Thêm Kiểu IntegerHeader này cho ta quyền truy cập (có thể) các kiểu có số bit cố định, hoặc, ít ra, các kiểu có ít nhất từng đó bit.
Nó cũng cho ta mấy macro tiện tay.
Có ba nhóm kiểu chính được định nghĩa ở đây, có dấu và không dấu:
intN_t, uintN_t)int_leastN_t, uint_leastN_t)int_fastN_t, uint_fastN_t)Chỗ N xuất hiện, bạn thay vào số bit, thường là bội của 8, ví dụ uint16_t.
Các kiểu sau được đảm bảo có định nghĩa:
int_least8_t uint_least8_t
int_least16_t uint_least16_t
int_least32_t uint_least32_t
int_least64_t uint_least64_t
int_fast8_t uint_fast8_t
int_fast16_t uint_fast16_t
int_fast32_t uint_fast32_t
int_fast64_t uint_fast64_tNhững cái còn lại là tùy chọn, nhưng bạn có thể sẽ có luôn các kiểu sau, chúng được yêu cầu khi hệ thống có integer đúng kích thước đó không có padding và dùng biểu diễn two’s-complement… đây là trường hợp với Mac, PC và cả đống hệ thống khác. Tóm lại, bạn nhiều khả năng có sẵn mấy cái này:
int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_tSố bit khác cũng có thể được hỗ trợ nếu implementation muốn làm chuyện điên rồ.
Ví dụ:
#include <stdint.h>
int main(void)
{
int16_t x = 32;
int_fast32_t y = 3490;
// ...Có vài kiểu tùy chọn là integer có khả năng giữ kiểu pointer.
intptr_t
uintptr_tBạn có thể convert void* thành một trong các kiểu này, rồi trở lại. Và các void* sẽ so sánh bằng nhau.
Use case là bất cứ chỗ nào bạn cần một integer đại diện cho pointer vì lý do nào đó.
Ngoài ra, có vài kiểu tồn tại chỉ để là integer lớn nhất mà hệ của bạn hỗ trợ:
intmax_t
uintmax_tFact vui: bạn có thể in các kiểu này với format specifier "%jd" và "%ju" của printf().
Cũng có cả đống macro trong <inttypes.h>(#inttypes) bạn có thể dùng để in bất kỳ kiểu nào ở trên.
Các macro sau định nghĩa giá trị min và max cho các kiểu này:
INT8_MAX INT8_MIN UINT8_MAX
INT16_MAX INT16_MIN UINT16_MAX
INT32_MAX INT32_MIN UINT32_MAX
INT64_MAX INT64_MIN UINT64_MAX
INT_LEAST8_MAX INT_LEAST8_MIN UINT_LEAST8_MAX
INT_LEAST16_MAX INT_LEAST16_MIN UINT_LEAST16_MAX
INT_LEAST32_MAX INT_LEAST32_MIN UINT_LEAST32_MAX
INT_LEAST64_MAX INT_LEAST64_MIN UINT_LEAST64_MAX
INT_FAST8_MAX INT_FAST8_MIN UINT_FAST8_MAX
INT_FAST16_MAX INT_FAST16_MIN UINT_FAST16_MAX
INT_FAST32_MAX INT_FAST32_MIN UINT_FAST32_MAX
INT_FAST64_MAX INT_FAST64_MIN UINT_FAST64_MAX
INTMAX_MAX INTMAX_MIN UINTMAX_MAX
INTPTR_MAX INTPTR_MIN UINTPTR_MAXVới kiểu signed kích thước chính xác, min chính xác là \(-(2^{N-1})\) và max chính xác là \(2^{N-1}-1\). Và với kiểu unsigned kích thước chính xác, max chính xác là \(2^N-1\).
Với biến thể signed “least” và “fast”, độ lớn và dấu của min ít nhất là \(-(2^{N-1}-1)\) và max ít nhất là \(2^{N-1}-1\). Và với unsigned, ít nhất là \(2^N-1\).
INTMAX_MAX ít nhất là \(2^{63}-1\), INTMAX_MIN ít nhất là \(-(2^{63}-1)\) xét về dấu và độ lớn. Và UINTMAX_MAX ít nhất là \(2^{64}-1\).
Cuối cùng, INTPTR_MAX ít nhất là \(2^{15}-1\), INTPTR_MIN ít nhất là \(-(2^{15}-1)\) xét về dấu và độ lớn. Và UINTPTR_MAX ít nhất là \(2^{16}-1\).
Có một đống kiểu trong <inttypes.h>(#inttypes) có giới hạn được định nghĩa ở đây. (<inttypes.h> include <stdint.h>.)
| Macro | Mô tả |
|---|---|
PTRDIFF_MIN |
Giá trị min của ptrdiff_t |
PTRDIFF_MAX |
Giá trị max của ptrdiff_t |
SIG_ATOMIC_MIN |
Giá trị min của sig_atomic_t |
SIG_ATOMIC_MAX |
Giá trị max của sig_atomic_t |
SIZE_MAX |
Giá trị max của size_t |
WCHAR_MIN |
Giá trị min của wchar_t |
WCHAR_MAX |
Giá trị max của wchar_t |
WINT_MIN |
Giá trị min của wint_t |
WINT_MAX |
Giá trị max của wint_t |
Spec nói PTRDIFF_MIN về độ lớn sẽ ít nhất là -65535. Và PTRDIFF_MAX với SIZE_MAX sẽ ít nhất là 65535.
SIG_ATOMIC_MIN và MAX sẽ hoặc là -127 và 127 (nếu signed) hoặc 0 và 255 (nếu unsigned).
Tương tự với WCHAR_MIN và MAX.
WINT_MIN và MAX sẽ hoặc là -32767 và 32767 (nếu signed) hoặc 0 và 65535 (nếu unsigned).
Nếu bạn còn nhớ, bạn có thể chỉ định kiểu cho hằng integer:
int x = 12;
long int y = 12L;
unsigned long long int z = 12ULL;Bạn có thể dùng macro INTN_C() và UINTN() trong đó N là 8, 16, 32 hoặc 64.
uint_least16_t x = INT16_C(3490);
uint_least64_t y = INT64_C(1122334455);Biến thể của mấy cái này là INTMAX_C() và UINTMAX_C(). Chúng tạo một hằng phù hợp để lưu trong intmax_t hoặc uintmax_t.
intmax_t x = INTMAX_C(3490);
uintmax_t x = UINTMAX_C(1122334455);