2012-10-31 88 views
24

Vì có nhiều loại mô hình dữ liệu 64 bit khác nhau (LLP64/IL32P64, LP64/I32LP64, ILP64, SILP64), cách tuân thủ tiêu chuẩn cụ thể là 64 -bit chữ số nguyên không dấu?Chỉ định các số nguyên nguyên không dấu 64 bit trên các mô hình dữ liệu 64 bit

Chỉ định hậu tố của ULL có đủ không? Hoặc tôi sẽ kết thúc gây ra các chữ được hiểu là 128-bit trên một số mô hình dữ liệu?

+0

Sẽ ổn nếu bạn chỉ định số nguyên cho 'uint64_t'. – kennytm

+0

@KennyTM: Chỉ tối đa 2^32 - 1, tại thời điểm đó bạn có thể gặp rắc rối ... – DevSolar

+0

@DevSolar: Tôi có nghĩa là số nguyên với hậu tố ULL, chắc chắn sẽ hoạt động với các giá trị lên đến 18446744073709551615. – kennytm

Trả lời

34

Bạn nên sử dụng <cstdint>/<stdint.h>, nếu bạn có. Điều này sẽ cung cấp cho bạn:

  • uint64_t là một kiểu dữ liệu integer unsigned đó là 64 bit có kích thước
  • UINT64_C() là một macro để tạo hằng của các loại uint64_t, bởi có append vĩ mô hậu tố thích hợp.
+2

là UINT64_C đảm bảo có sẵn trong C++? (câu hỏi là về C++, không phải C99) – jalf

+0

@jalf Tốt, cảm ơn! Tôi không chắc, nhưng có vẻ như vậy. Tôi viết lại và thay đổi liên kết. – unwind

0

Theo hiểu biết của tôi, không có cách nào để thêm một chữ số nguyên vào một chiều rộng bit cụ thể; lựa chọn duy nhất của bạn là l, ul, ll, và ull.

Nếu bạn hoang tưởng về nó, bạn sẽ phải quấn các chữ của bạn trong một kiểm tra #if cho các kích thước của long/long long.

Sau đó, một lần nữa, như KennyTM chỉ ra ở trên, miễn là literals bạn trong khoảng 64bit gán cho một giá trị 64bit, nó không quan trọng nhiều nếu bản thân theo nghĩa đen là 64 hoặc 128 bit, hoặc Phải không?

+0

Điều đó sẽ không làm cho trình biên dịch phàn nàn rằng tôi đang chỉ định một số nguyên yêu cầu chiều rộng bit lớn hơn đến một số nhỏ hơn (cảnh báo cắt ngắn)? –

+0

Sử dụng hậu tố chữ hoa để giữ cho chữ được đọc có thể đọc được: 1L, 1LL thay vì 1l, 1ll. – pixelgrease

+0

... hoặc sử dụng phông chữ phân biệt chính xác 1/l, 0/O ... – DevSolar

1

C và C++ không có các loại biến bit 32/64/128 được chuẩn hóa. Một ví dụ dài, trên một số hệ thống là 32 bit và 64 trên các hệ thống khác. Thật khó chịu, nhưng hầu hết các hệ điều hành đều cung cấp một số typedefs tốt hơn để giúp bạn, chẳng hạn như uint32, v.v., do đó bạn chọn một loại chính xác mà bạn cần.

Đây là công việc của tập lệnh configure tốt: để xác định hệ thống cung cấp gì, kiểm tra xem nó có hoạt động hay không và giúp bạn chọn đúng loại kiến ​​trúc phù hợp mà bạn đang chạy.

+3

C và C++ * do * cung cấp các loại biến được kích thước tiêu chuẩn cho các tiêu đề '' và ''. Họ có tên như 'uint32_t'. – amaurea

+0

@amaurea - các tên như 'uint32_t' không khả dụng trên các hệ thống không có ** kích thước ** chính xác đó. Trong hầu hết các trường hợp, 'uint_least32_t', v.v. sẽ là lựa chọn tốt hơn. –

+0

@Pete Becker hệ thống mà không có 'uint32_t' và' uint64_t' là gần như không thể tìm thấy, không phải là họ, rơi vào cùng thể loại như hệ thống mà một byte không phải là 8 bit dài và sự tò mò khác? – amaurea

1

Đối với hầu hết các phần, điều đó không quan trọng. Nếu bạn không cho nó một hậu tố, kiểu của một chữ số nguyên được xác định bởi giá trị của nó. Nếu trình biên dịch có unsigned long 32 bit và một bit unsigned long long 64 bit, một giá trị chưa ký quá lớn để vừa với unsigned long nhưng không quá lớn đối với unsigned long long sẽ có loại unsigned long long.

Các vấn đề liên quan