| Contents |

22 <stdint.h> Thêm Kiểu Integer

Header 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.

22.1 Integer Kích Thước Cụ Thể

Có ba nhóm kiểu chính được định nghĩa ở đây, có dấu và không dấu:

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_t

Nhữ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_t

Số 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;

    // ...

22.2 Các Kiểu Integer Khác

Có vài kiểu tùy chọn là integer có khả năng giữ kiểu pointer.

intptr_t
uintptr_t

Bạ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_t

Fact vui: bạn có thể in các kiểu này với format specifier "%jd""%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.

22.3 Macros

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_MAX

Vớ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\).

22.4 Giới Hạn Khác

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_MINMAX sẽ hoặc là -127 và 127 (nếu signed) hoặc 0 và 255 (nếu unsigned).

Tương tự với WCHAR_MINMAX.

WINT_MINMAX sẽ hoặc là -32767 và 32767 (nếu signed) hoặc 0 và 65535 (nếu unsigned).

22.5 Macro Để Khai Báo Hằng

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()UINTN() trong đó N8, 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()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);

| Contents |