2011-03-21 30 views
34

Có loại nào lớn hơn int dài trong C++ không?Có loại nào lớn hơn int dài trong C++ không?

Trình biên dịch của tôi là g ++.

+1

Những loại bạn đang nói về? Các loại số nguyên hoặc bất kỳ loại nào? Những gì "lớn hơn" trong trường hợp này: phạm vi hoặc kích thước? Trong mọi trường hợp, gõ 'int [100]' có khả năng lớn hơn rất nhiều so với 'long long', nhưng tôi không nghĩ đây là điều bạn đang hỏi. Làm rõ câu hỏi của bạn. Tại thời điểm này nó làm cho cảm giác ít. – AnT

+1

bạn có thể thử lâu dài (Tôi chỉ đùa) Tôi tin rằng lâu dài là lớn nhất ở 64 bit trên tất cả các kiến ​​trúc –

+1

@Jesus Ramos: Với ít nhất 64 bit (có thể lớn hơn). @AndreyT: Không chính thức, nhưng nó là một phần mở rộng gần như phổ biến mà chúng tôi cũng mong đợi để xem trong phiên bản tiếp theo của tiêu chuẩn (để mang lại cho chúng tôi phù hợp với C). –

Trả lời

5

__int128
__uint128

+4

__int128 không được bật trên Microsoft Visual –

+0

@BrendanWebster Bạn có thể bật tính năng này không? –

8

Không, nhưng bạn có thể sử dụng thư viện như GMP để xử lý số lượng lớn hơn.

14
+0

Lưu ý: 'intmax_t' không xem xét nó http://stackoverflow.com/questions/21265462/why-in-g-stdintmax-t-is-not-a-int128-t –

9

Tùy thuộc vào những gì cần thiết của bạn, bạn có thể tạo struct của riêng bạn để xử lý kiểu dữ liệu:

#include <cstdint> 

struct uint256_t 
{ 
    std::uint64_t bits[4]; 
}; 

uint256_t x; 
2

Tóm tắt ...

Nếu bạn cần lưu trữ các giá trị số nguyên chính xác mà sẽ không phù hợp trong 'long long', gcc cung cấp loại __int128. Đây là một phần mở rộng gcc, không phải là một phần của tiêu chuẩn C++ (như của văn bản này).

Nếu bạn cần làm việc với các giá trị số nguyên chính xác lớn hơn, bạn có thể cần arbitrary-precision arithmetic package, chẳng hạn như GMP. Nếu nhu cầu của bạn rất hạn chế, bạn có thể cuộn mã chính xác mở rộng của riêng bạn, nhưng điều đó có thể nhanh chóng trở nên phức tạp hơn (và kém hiệu quả và đáng tin cậy hơn) so với sử dụng thư viện hiện có.

Nếu bạn cần lưu trữ số lượng lớn nhưng không cần để lưu trữ các giá trị lớn hơn chính xác, bạn có thể sử dụng phao hoặc đôi: Đây có thể đại diện cho số của cường độ lớn hơn nhiều, nhưng với ít precision.

Và tất nhiên, nếu bạn chỉ muốn chiếm nhiều bộ nhớ hơn, khai báo một mảng ;-)

+0

Có thể có khả năng sử dụng' streampos ', tùy thuộc vào kích thước cần thiết? – jorgen

4

Tiêu chuẩn

loại nguyên Extended được phép một cách rõ ràng bằng C và các tiêu chuẩn C++.

C++ 11

C++11 N3337 draft 3.9.1 "loại cơ bản" đoạn 3 nói:

Có năm loại nguyên ký tiêu chuẩn: “ký char”, “int ngắn”, “Int”, “long int” và “long long int”. Trong danh sách này, mỗi loại cung cấp ít nhất là dung lượng lưu trữ nhiều như trước đó trong danh sách. Cũng có thể có các kiểu số nguyên có dấu mở rộng được xác định thực hiện. Các loại số nguyên được ký kết chuẩn và mở rộng được gọi chung là các loại số nguyên đã ký. Đồng bằng ints có kích thước tự nhiên được đề xuất bởi kiến ​​trúc của môi trường thực thi các loại số nguyên đã ký khác được cung cấp để đáp ứng các nhu cầu đặc biệt.

Bạn cũng nên xem xét intmax_t, mà 18.4.1 "Header tóm tắt" khoản 2 nói:

Tiêu đề xác định tất cả các chức năng, chủng loại, và macro giống như 7,18 trong tiêu chuẩn C.

C99

C99 N1256 draft cho phép một cách rõ ràng họ tại 6.2.5 "Các loại" Đoạn 4:

Có năm loại nguyên ký tiêu chuẩn, định là char ký, ngắn int, int , int dài và dài int. (Các kiểu này và các kiểu khác có thể là được chỉ định theo một số cách khác, như được mô tả trong 6.7.2.) Cũng có thể có các kiểu số nguyên được khai báo mở rộng được định nghĩa.28). 29)

và 7.18.1.5 "kiểu nguyên Greatest-width" đoạn 1 nói:

các loại sau đây chỉ định một loại nguyên ký có khả năng đại diện cho bất kỳ giá trị của bất kỳ loại nguyên ký:

intmax_t

0

Nếu bạn biết số của bạn sẽ luôn luôn là tích cực, bạn có thể mở rộng phạm vi của một int bằng cách gắn nhãn nó như unsigned

int myNum; // Range is from –2,147,483,648 to 2,147,483,647

unsigned int myNum; // Range is from 0 to 4,294,967,295

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