2011-08-11 44 views
8

Tôi biết sự khác biệt giữa dài và int Nhưng sự khác biệt giữa "dài dài" và "dài int"sự khác biệt giữa lâu dài và dài int

+0

bản sao có thể có của [Sự khác nhau giữa một int và một dài trong C++?] (Http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and- a-long-in-c) –

+0

@Martin: không hoàn toàn trùng lặp. Câu hỏi này liên quan đến cú pháp 'long int' so với' long'. –

+0

@Andr: Đóng đủ để các câu trả lời cho câu hỏi đó cũng trả lời câu hỏi này. Không cần phải trả lời các câu trả lời –

Trả lời

24

Có một số viết tắt cho các loại được cài sẵn.

  • short là (signed) short int
  • long là (signed) long int
  • long long là (signed) long long int.

Trên nhiều hệ thống, short là 16-bit, long là 32-bit và long long là 64 bit. Tuy nhiên, hãy nhớ rằng tiêu chuẩn chỉ yêu cầu

sizeof(char) == 1 
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 

Và hậu quả là trên hệ thống kỳ lạ, sizeof(long long) == 1 là có thể.

+1

Bạn có một vài bảo đảm khác từ tiêu chuẩn: sizeof (long long) * CHAR_BITS> = 64 trong khi sizeof (dài) * CHAR_BITS> = 32 –

+0

Tôi không có bản sao của tiện ích tiêu chuẩn, chỉ cần tra cứu nó [Ngôn ngữ lập trình C++] (http://www.amazon.com/Programming-Language-3rd-Bjarne-Stroustrup/dp/0201889544). –

+0

@LokiAstari: Tôi nghĩ những đảm bảo đó về cơ bản chỉ xuất phát từ Nguyên tắc Pigeonhole, đúng không? Đối với bất kỳ giá trị nào có thể của 'long', phải có một số giá trị' sizeof (long) 'của loại' unsigned char' giá trị đại diện cho nó; (1 << (CHAR_BITS * sizeof (long))) chuỗi ký tự có thể phải có khả năng nhận biết ít nhất '(1LL << 32)' các giá trị như vậy. – supercat

4

long long có thể là một loại lớn hơn long int là gì là gì. Ví dụ trên x86 32 bit long long sẽ là loại 64 bit thay vì 32 bit cho long int.

+0

Điều này có nghĩa là trong các máy 32Bit nếu chúng ta cần lưu trữ kiểu dữ liệu của 64bit len, thì chúng ta có thể sử dụng lâu dài phải không? – Syedsma

+0

@Syedsma: Có. lâu dài được đảm bảo ít nhất 64 bit. –

+2

Cẩn thận: 'long long' không phải là một phần của tiêu chuẩn C++! Nó là * một phần của tiêu chuẩn C99, và cũng là một phần của C++ 0x mặc dù, rất nhiều trình biên dịch C++ hỗ trợ nó. – Fozi

2

An int trên hệ thống 16 bit là 16 bit. Một "long" được giới thiệu dưới dạng số nguyên 32 bit, nhưng trên hệ thống 32 bit longint có nghĩa là cùng một điều (cả hai đều là 32 bit.) Vì vậy, trên các hệ thống 32 và 64 bit, long longlong int đều là 64 bit. Ngoại lệ là UNIX 64 bit, trong đó long là 64 bit.

Xem the integer Wikipedia article để biết bảng chi tiết hơn.

+0

Không có gì đảm bảo rằng trên hệ thống 64 bit mà int lớn hơn 32. Trên thực tế, Windows có thể tùy thuộc vào cách hệ điều hành được biên dịch. tức là hệ điều hành được biên dịch là 32/64 bit cho nền tảng 64 bit? –

+0

@Martin: Theo "hệ thống", tôi có nghĩa là toàn bộ cấu hình bao gồm cả hệ điều hành, mà tôi nhận ra bây giờ là không rõ ràng. – richardolsson

+1

Bạn cũng có thể nói ngoại lệ là Windows. Các hệ thống có độ dài 32 bit và 64 bit và con trỏ được gọi là "LP64". Các hệ thống có một con trỏ 32 bit int và dài và 64 bit được gọi là "LLP64" (vì Long Long và Pointer là 64 bit). AFAIK tất cả các hệ thống giống như unix chính sử dụng LP64 và Windows là hệ thống chính duy nhất sử dụng LLP64 trên các máy 64 bit. Tôi không biết về bất kỳ hệ thống 32 bit nào trên đó 'long int' có cùng kích thước với' long long'. 'long int' đồng nghĩa với' long', luôn luôn. –

0

long int là từ đồng nghĩa lâu dài. long long int là một từ đồng nghĩa với long long int.

Đảm bảo duy nhất bạn có trong tiêu chuẩn C++ là long long ít nhất là lớn nhất là long nhưng có thể dài hơn. Điều này được quy định trong §3.9.1.2 trong bản dự thảo công khai gần đây nhất của tiêu chuẩn n3242.

1

Tiêu chuẩn C không thực hiện bất kỳ yêu cầu chiều rộng cụ thể nào cho các loại tích phân ngoài phạm vi giá trị tối thiểu mà loại cần có thể đại diện và chiều rộng không giảm: short <= int <= long int <= long long int (tương tự cho các loại không dấu). long long chỉ trở thành một phần của tiêu chuẩn trong C99 và C++ 0x, nhân tiện. Phạm vi yêu cầu tối thiểu có thể được tìm thấy trong this Wikipedia article.

9

Theo tiêu chuẩn C các loại không thể thiếu được định nghĩa để cung cấp ít nhất phạm vi sau đây:

int      -32767 to    +32767 representable in 16 bits 
long    -2147483647 to   +2147483647 representable in 32 bits 
long long -9223372036854775807 to +9223372036854775807 representable in 64 bits 

Mỗi thể được biểu diễn như để hỗ trợ một phạm vi rộng hơn. Trên các hệ thống 32 bit phổ biến, intlong có cùng biểu diễn 32 bit.

Lưu ý rằng giới hạn âm là đối xứng với các đối tác dương tính của chúng để cho phép biểu thị dấu hiệu và độ lớn: tiêu chuẩn ngôn ngữ C không áp đặt bổ sung hai.

+0

@BaneOfSerenity Các giá trị này được trích dẫn từ một bản sao cũ của tiêu chuẩn ngôn ngữ C, như được đề cập trong câu trả lời của tôi và không có nghĩa là để mô tả cách các loại tích phân thường được thể hiện như thế nào. Trừ khi chúng được thay đổi theo tiêu chuẩn mới nhất mà tôi không có quyền truy cập, hiệu chỉnh của bạn là * sai * –

+0

Bạn đang đề cập đến tài liệu chuẩn C nào để đảm bảo phạm vi này? –

+1

Chúng được quy định trong ISO/IEC 9989: 1999, mục 5.2.4.2.1. "Giá trị được xác định thực hiện của chúng phải bằng hoặc lớn hơn về độ lớn (giá trị tuyệt đối) đối với những giá trị được hiển thị, với cùng một dấu hiệu." –

0

tôi nghĩ:

"dài" tăng gấp đôi số lượng các bit được phân bổ cho các kiểu dữ liệu. Quá dài (32 bit?) Trở thành 64 bit. Int (16 bit?) Trở thành 32 bit.

3

Trên hệ thống 64 bit, nó không tạo sự khác biệt về kích thước của chúng. Trên hệ thống 32 bit, thời gian dài được đảm bảo giá trị lưu trữ của phạm vi 64 bit.

Để tránh tất cả những nhầm lẫn này, tốt hơn nên sử dụng các loại tích phân tiêu chuẩn: (u)int16_t, (u)int32_t and (u)int64_t có sẵn qua stdint.h cung cấp độ trong suốt.

+0

Than ôi, các kiểu như 'uint32_t' không nhất thiết phải giúp mọi thứ, vì trình biên dịch được tự do sử dụng kiểu' int' lớn hơn và quảng bá 'uint32_t' cho nó.Do đó, (uint32_t) 0xFFFFFFFF * (uint32_t) 0xFFFFFFFF có thể mang lại 1, hoặc -8589934591, hoặc 18446744065119617025 (hoặc, cho rằng, bất cứ điều gì vì nó có thể mang lại hành vi không xác định). – supercat

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