Các kiểu như uint32, int32, uint64, int64 có được định nghĩa trong bất kỳ tiêu đề stdlib nào không?


94

Tôi thường thấy mã nguồn sử dụng các loại như uint32, uint64 và tôi tự hỏi liệu chúng có nên được lập trình viên xác định trong mã ứng dụng hay chúng được định nghĩa trong tiêu đề lib tiêu chuẩn.

Cách tốt nhất để có những loại này trên mã nguồn ứng dụng của tôi là gì?

Câu trả lời:


135

C99 stdint.hxác định những điều này:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

Và, nếu kiến ​​trúc hỗ trợ chúng:

  • int64_t
  • uint64_t

Cũng có nhiều kiểu gõ số nguyên khác nhau stdint.h.

Nếu bạn gặp khó khăn khi không có môi trường C99 thì có lẽ bạn nên cung cấp các typedef của riêng mình và sử dụng các loại C99.

Các uint32uint64(tức là nếu không có sự _thậu tố) có lẽ là ứng dụng cụ thể.


16
Câu trả lời này là sai. Tất cả những điều trên chỉ khả dụng nếu loại chiều rộng chính xác có kích thước đó (không có phần đệm) tồn tại trong quá trình triển khai. Tuy nhiên, ngay cả khi không, các loại int_leastNN_tuint_leastNN_tcho NN8, 16, 32 và 64 phải luôn tồn tại . C99 không cho phép triển khai mà không có kiểu số nguyên ít nhất 64 bit, vì long longnó được yêu cầu ít nhất là lớn.
R .. GitHub NGỪNG TRỢ GIÚP ICE

@R ..: Nói "POSIX stdint.h" thay vì "C99 stdint.h" có chính xác không?
mu quá ngắn

1
POSIX stdint.hyêu cầu tất cả.
R .. GitHub DỪNG TRỢ GIÚP ICE

1
@R .., Bạn có thể vui lòng chỉnh sửa câu trả lời này cho đúng không? Tôi đã mất một chút để phân tích cú pháp kết hợp giữa nội dung hiện tại và nhận xét của bạn.
merlin2011

SDL xác định bí danh alias như vậy typedef uint32_t Uint32;trong bao gồm / SDL_stdinc.h (nếu bạn là SDL người dùng)
Et7f3XIV

10

Tất cả các kiểu số nguyên đó đều được định nghĩa trong stdint.h


Không stdint.hthực hiện cụ thể? Cũng xem câu hỏi nàycâu hỏi này
Chris Frederick

3
Nhìn vào tệp, tôi tìm thấy "ISO C99: 7.18 Loại số nguyên <stdint.h>" trong các nhận xét. Tôi cho rằng bạn sẽ nhận được stdint.hnếu bạn tôn trọng tiêu chuẩn C99.
philix

Tôi không tìm thấy bất kỳ ai trong số họ trong stdint.h. Này trả về 0 lượt truy cập: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww

1
@jww: Trong trường hợp của tôi, tệp đó chứa #include "stdint-gcc.h"và việc trộn tệp đó sẽ mang lại các định nghĩa.
Victor Zamanian,

1
@jww vâng, chúng không tồn tại. Những cái duy nhất là tiêu chuẩn và cần được xác định ở đó là những cái có _thậu tố, như được liệt kê trong câu trả lời ở trên.
Victor Zamanian,

2

Nếu bạn đang sử dụng C99 chỉ cần bao gồm stdint.h. BTW, các loại 64bit có iff bộ xử lý hỗ trợ chúng.


Vui lòng trích dẫn điều gì đó về vấn đề này.
BiGYaN

6
x86 không hỗ trợ toán học 64-bit nhưng có các loại 64-bit.
R .. GitHub NGỪNG TRỢ GIÚP ICE

2
Đúng vậy. Nó hỗ trợ phép nhân 32-bit x 32-bit -> 64-bit, 64-bit / 32-bit -> thương số 32-bit & phép chia phần dư 32-bit, cũng như có phép cộng và trừ với hướng dẫn mượn. Nó được chế tạo để có thể thực hiện số học 64-bit, nếu chỉ vì 8086 cần để có thể thực hiện số học 32-bit.
Michael Morris

Ngoài ra còn có một uint128_tif __SIZEOF_INT128__được xác định là 16 hoặc lớn hơn (GCC và tương thích). Nó có sẵn trên các máy x86_64 / amd64, nhưng bộ vi xử lý không hỗ trợ nó. Chỉ Cray có kích thước thanh ghi đó, IIRC.
jww

0

Người hỏi thực sự đã hỏi về int16 (v.v.) chứ không phải (xấu xí) int16_t (v.v.).

Không có tiêu đề tiêu chuẩn - cũng như bất kỳ tiêu đề nào trong thư mục / usr / include / của Linux xác định chúng mà không có "_t".

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.