Cách tốt nhất để khai báo một kiểu số nguyên luôn là 4 byte trên bất kỳ nền tảng nào? Tôi không lo lắng về một số thiết bị hoặc máy cũ có 16-bit int
.
Cách tốt nhất để khai báo một kiểu số nguyên luôn là 4 byte trên bất kỳ nền tảng nào? Tôi không lo lắng về một số thiết bị hoặc máy cũ có 16-bit int
.
Câu trả lời:
#include <stdint.h>
int32_t my_32bit_int;
<inttypes.h>
' được ghi rõ ràng để bao gồm tiêu đề ' <stdint.h>
' (điều này không bình thường đối với tiêu đề C), nhưng <inttypes.h>
tiêu đề '' có thể có sẵn ở những nơi <stdint.h>
không có và có thể là lựa chọn tốt hơn cho tính di động. Các ' <stdint.h>
' tiêu đề là một phát minh của Ủy ban tiêu chuẩn, và đã được tạo ra để tự đứng triển khai của C (như trái ngược với việc triển khai tổ chức - những người bình thường) chỉ phải hỗ trợ ' <stdint.h>
' và không nhất thiết phải ' <inttypes.h>
' quá (nó cũng có nghĩa hỗ trợ ' <stdio.h>
', nếu không thì không cần thiết).
uint32_t
.
Câu trả lời của Corey là đúng cho "tốt nhất", theo ý kiến của tôi, nhưng một "int" đơn giản cũng sẽ hoạt động trong thực tế (vì bạn đang bỏ qua các hệ thống có int 16 bit). Tại thời điểm này, rất nhiều mã phụ thuộc vào int là 32-bit mà các nhà cung cấp hệ thống sẽ không thay đổi nó.
(Xem thêm tại sao dài là 32-bit trên rất nhiều hệ thống 64-bit và tại sao chúng ta lại có "dài dài".)
Tuy nhiên, một trong những lợi ích của việc sử dụng int32_t là bạn không gây ra vấn đề này!
Bạn có thể săn lùng một bản sao của Brian Gladman brg_types.h
nếu bạn không có stdint.h
.
brg_types.h
sẽ khám phá kích thước của các số nguyên khác nhau trên nền tảng của bạn và sẽ tạo typedef cho các kích thước phổ biến: 8, 16, 32 và 64 bit.
Bạn cần phải bao gồm inttypes.h
thay stdint.h
vì vì stdint.h
không có sẵn trên một số nền tảng như Solaris và inttypes.h
sẽ bao gồm stdint.h
cho bạn trên các hệ thống như Linux. Nếu bạn bao gồm inttypes.h
thì mã của bạn dễ di động hơn giữa Linux và Solaris.
Liên kết này giải thích những gì tôi đang nói: Liên kết HP về inttypes.h
Và liên kết này có một bảng hiển thị lý do tại sao bạn không muốn sử dụng long
hoặc int
nếu bạn có ý định về một số lượng bit nhất định có trong kiểu dữ liệu của bạn.
Liên kết IBM về các kiểu dữ liệu di động
stdint.h là lựa chọn hiển nhiên, nhưng nó không nhất thiết phải có sẵn.
Nếu bạn đang sử dụng thư viện di động, có thể nó đã cung cấp các số nguyên có chiều rộng cố định di động. Ví dụ, SDL có Sint32
(S là "đã ký") và GLib có gint32
.
Sử dụng <stdint.h>
.
Nếu triển khai của bạn hỗ trợ số nguyên 32 bit bổ sung của 2 thì nó phải xác định int32_t
.
Nếu không thì điều tốt nhất tiếp theo là int_least32_t
kiểu số nguyên được hỗ trợ bởi việc triển khai có ít nhất 32 bit, bất kể biểu diễn là gì (phần bù của hai, phần bù của một, v.v.).
Cũng int_fast32_t
có một kiểu số nguyên có chiều rộng ít nhất là 32-bit, được chọn với mục đích cho phép các hoạt động nhanh nhất cho yêu cầu kích thước đó.
Bạn có thể sử dụng long
, được đảm bảo có chiều rộng ít nhất là 32 bit do các yêu cầu về phạm vi tối thiểu được chỉ định bởi tiêu chuẩn.
Nếu bạn muốn sử dụng kiểu số nguyên nhỏ nhất để vừa với số 32 bit, thì bạn có thể sử dụng các câu lệnh tiền xử lý như sau với các macro được định nghĩa trong <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX