2012-03-07 3 views
7

Tôi cần trình bày số nhị phân 40 bit. Loại dữ liệu C nào sẽ được sử dụng để xử lý điều này?Loại dữ liệu C nào có thể đại diện cho số nhị phân 40 bit?

+5

+1 để bù đắp các downvotes không giải thích được. –

+0

Dường như 2 downvoters đã ghi lại bạn +3 (đánh giá từ 5 +1 trên nhận xét +1) :-) –

+0

không di động, nhưng trên nhiều DSP của TI [dài là loại 40 bit] (http: // stackoverflow .com/a/28352310/995714) quá lâu có thể được sử dụng cho mục đích đó. dài trên hầu hết các hệ thống POSIX có 64 bit và cũng có thể được sử dụng –

Trả lời

9

Nếu bạn đang sử dụng C99 hoặc C11 trình biên dịch phù hợp, sau đó sử dụng int_least64_t để tương thích tối đa. Hoặc, nếu bạn muốn loại không dấu, uint_least64_t. Cả hai đều được xác định trong <stdint.h>

<stdint.h> thường cũng xác định int64_t, nhưng vì nó không được yêu cầu theo tiêu chuẩn, nó có thể không được xác định trong mọi lần triển khai. Tuy nhiên:

  • int_least64_t - ít nhất là 64 bit, và
  • int_fast64_t - kích thước nhanh nhất trong việc thực hiện này ít nhất là 64 bit

đều yêu cầu phải có mặt tại C99 và C11 (Xem § 7.18.1.2-3 trong tiêu chuẩn C99, và § 7.20.1.2-3 trong tiêu chuẩn C11).


Mặc dù C99 xác định rằng long longat least 64 bits on a particular machine (§ 5.2.4.2.1), các loại trong <stdint.h> được thiết kế để được một cách rõ ràng cầm tay.

Bạn có thể đọc thêm về kích thước nguyên trên các nền tảng khác nhau here. Lưu ý rằng kích thước của các loại số nguyên là một vấn đề với loại dữ liệu long - trên Windows 64 bit, hiện tại là 32 bit, trong khi trên 64 bit Linux thì 64 bit. Vì lý do này, tôi tin rằng bạn an toàn nhất khi sử dụng các loại từ <stdint.h>

Điều đáng chú ý là một số người cảm thấy rằng long long dễ đọc hơn. Cá nhân, tôi thích các loại từ <stdint.h>, bởi vì chúng cho phép bạn nói những gì bạn có nghĩa là khi bạn sử dụng chúng - mà tôi tìm thấy dễ đọc hơn. Tất nhiên, khả năng đọc thường là một vấn đề của hương vị - và nếu bạn đang làm việc với một codebase hiện có, tôi muốn chỉ cần làm theo bất cứ điều gì họ làm :)


Nếu trình biên dịch của bạn chỉ hỗ trợ C89, sau đó sẽ cho phép R..'s solution bạn có tới 53 bit chính xác số nguyên.

+1

+1 để sử dụng tính năng này trên 'long long'. –

+2

Tôi không đồng ý. 'long long' thực ra là lý thuyết * nhiều hơn * xách tay, bởi vì việc triển khai C99 hoặc C11 phù hợp phải cung cấp kiểu đó trong khi' int64_t' không nhất thiết phải có. Chỉ nên sử dụng 'int64_t' nếu bạn yêu cầu loại bổ sung chính xác 64 bit không có đệm - trong trường hợp như thế này, nơi bạn chỉ cần" ít nhất 40 bit "thì' long long' là thích hợp hơn, vì nó không thêm không cần thiết hạn chế. – caf

+0

@caf: Không C99 cũng chỉ định 'int64_t' và gia đình? (Và theo như tôi biết, chúng vẫn còn hiện diện trong C11). Nếu bạn không muốn chỉ định chính xác chiều rộng 64 bit, thì bạn có thể sử dụng 'int_least64_t' hoặc' int_fast64_t'. –

3

long long là loại số nguyên với ít nhất 64 bit. Nó sẽ phù hợp với các giá trị 40 bit đã ký trên tất cả các nền tảng. Bạn cũng có thể sử dụng unsigned long long cho các giá trị chưa ký 64 bit trở lên.

1

Câu trả lời hiện có là tốt, nhưng nếu bạn muốn hỗ trợ C89, double sẽ có thể lưu trữ số nguyên 40 bit chính xác trên tất cả các triển khai tuân thủ IEEE 754.