Cách khai báo số nguyên 32 bit trong C


75

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.


6
Trong C, một byte không nhất thiết phải là 8 bit, vì vậy 32 bit và 4 byte có thể có nghĩa khác nhau.
KTC

1
@KTC: có nền tảng nào định nghĩa byte khác nhau không?
Mr. Shiny and New 安 宇

Tôi cũng tò mò muốn biết char! = 8bits và một byte! = 8bits ở đâu. char! = 8bits có vẻ ổn, vì tôi có thể có char == 4bits trong hệ thống chưa được thiết kế của riêng tôi hoặc một số hệ thống cũ, nhưng byte! = 8bits ở đâu ??
seg.server.fault

2
Khá nhiều DSP và những thứ tương tự có ký tự 16 bit (và C không có khái niệm "byte" nào ngoài char - nó thực chất là đơn vị bộ nhớ có thể định địa chỉ nhỏ nhất).
Steve Jessop

1
Một trong những Honeyboxen chúng tôi vẫn có có 6-bit và 9-bit byte dựa trên chế độ địa chỉ bạn đang ở.
user7116

Câu trả lời:


111

3
Chỉ cần lưu ý intN_t (và uintN_t) là tùy chọn về tiêu chuẩn. Nó được yêu cầu phải được xác định nếu và chỉ khi hệ thống có các loại đáp ứng yêu cầu.
KTC

30
Đó là những gì bạn muốn mặc dù. Nếu mã thực sự yêu cầu int 32-bit và bạn cố gắng biên dịch nó trên một nền tảng không hỗ trợ chúng, bạn muốn trình biên dịch trả lại cho nhà phát triển. Để nó chọn một số kích thước khác và tiếp tục sẽ rất kinh khủng.
TED

12
Lưu ý rằng tiêu đề ' <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).
Jonathan Leffler

2
Có cách nào để xác định int32_t là không dấu không?
Matthew Herbst

5
@MatthewHerbst , uint32_t.
user545424

13

C không quan tâm lắm đến kích thước chính xác của các kiểu số nguyên, C99 giới thiệu tiêu đề stdint.h , đây có lẽ là lựa chọn tốt nhất của bạn. Bao gồm điều đó và bạn có thể sử dụng vd int32_t. Tất nhiên không phải tất cả các nền tảng đều có thể hỗ trợ điều đó.


11

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!


Không cần phải “bỏ qua các hệ thống có int 16 bit”, độ dài được đảm bảo là rộng ít nhất 32 bit ở mọi nơi.
Bastien Léonard

3
Đúng, nhưng việc sử dụng "long" không giải quyết được yêu cầu ban đầu, đó là thứ chính xác là 32 bit. Ví dụ: trên (ít nhất một số phiên bản của) Linux 64 bit, chiều dài là 64 bit - và đó là thứ có thể xuất hiện trong thực tế.
Brooks Moses

5

Bạn có thể săn lùng một bản sao của Brian Gladman brg_types.hnế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.


Trên thực tế, khi xem xét một vài "brg_types.h", tôi thấy rằng tệp này chỉ xác định các số nguyên không dấu (ví dụ: "uint_8t", "uint_16t", "uint_32t" và "uint_64t"). OP cần số nguyên có dấu.
swdev

5

Bạn cần phải bao gồm inttypes.hthay stdint.hvì vì stdint.hkhông có sẵn trên một số nền tảng như Solaris và inttypes.hsẽ bao gồm stdint.hcho bạn trên các hệ thống như Linux. Nếu bạn bao gồm inttypes.hthì 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 longhoặc intnế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


1

Nếu stdint.h không có sẵn cho hệ thống của bạn, hãy tự tạo. Tôi luôn có một tệp có tên "styles.h" có typedef cho tất cả các giá trị 8, 16 và 32 bit có dấu / không dấu.


0

cũng tùy thuộc vào nền tảng mục tiêu của bạn, bạn có thể sử dụng công cụ tự động cho hệ thống xây dựng của mình

nó sẽ xem liệu stdint.h / inttypes.h có tồn tại hay không và nếu không, chúng sẽ tạo typedefs thích hợp trong "config.h"


0

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.


0

C99 trở lên

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_tkiể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_tcó 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 đó.

ANSI 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>:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.