2011-12-29 30 views
9

Có phải int theo mặc định signed long int bằng C++?Là `int` theo mặc định` đã ký dài int` trong C++?

Nền tảng và/hoặc trình biên dịch có phụ thuộc không? Nếu vậy, làm thế nào?

[EDIT]

Có phải bất kỳ người được bảo lãnh sau đây được lặp lại?

signed short int 
signed int 
signed long int 
signed long long int 
unsigned short int 
unsigned int 
unsigned long int 
unsigned long long int 
+0

Trên 'linux-amd64'' int' có 32 bit trong khi 'long' có 64. –

+0

Điều này là trực quan rõ ràng: tại sao ngôn ngữ sẽ đốt cháy từ khóa để biểu thị cùng một thứ? –

+3

Không thể đồng ý với điều này. Nó không phải luôn luôn lý tưởng miễn phí của sự mơ hồ và dự phòng. – qazwsx

Trả lời

8

Tất cả các số nguyên loại khác nhau, tức là bạn có thể tải xuống một cách an toàn các chức năng cho tất cả chúng và bạn sẽ không gặp bất kỳ xung đột nào. Tuy nhiên, một số lần sử dụng cùng một số bit cho biểu diễn của chúng. Ngay cả khi họ sử dụng cùng một số bit ký kết và các loại unsigned luôn luôn có một phạm vi khác nhau. Ngoại trừ char, sử dụng bất kỳ loại số nguyên nào không có signed tương đương với việc sử dụng nó với signed, tức là signed intint là tương đương. char là một loại khác là signed charunsigned char nhưng char có cùng một phạm vi và phạm vi là signed char hoặc unsigned char. Bạn có thể sử dụng std::numeric_limits<char>::is_signed để tìm hiểu xem nó sử dụng.

Về các khía cạnh thú vị hơn. Các điều kiện sau đều đúng:

  • 7 <= std::numeric_limits<signed char>::digits
  • sizeof(char) == 1
  • sizeof(char) == sizeof(signed char)
  • sizeof(char) == sizeof(unsigned char)
  • 15 <= std::numeric_limits<short>::digits
  • sizeof(char) <= sizeof(short)
  • sizeof(short) <= sizeof(int)
  • 31 <= std::numeric_limits<long>::digits
  • sizeof(int) <= sizeof(long)
  • 63 <= std::numeric_limits<long long>::digits
  • sizeof(long) <= sizeof(long long)
  • sizeof(X) == sizeof(signed X)
  • sizeof(signed X) == sizeof(unsigned X)

(nơi "X" là một trong những char, short, int, long, và long long).

Điều này có nghĩa là kích thước của tất cả loại nguyên có thể giống với loại này giữ ít nhất 64 bit (và dường như Cray X-MP là một con thú). Trên các máy hiện đại thường là sizeof(int) == sizeof(long) nhưng có các máy ở nơi sizeof(int) == sizeof(short). Cho dù long là 32 hoặc 64 bit phụ thuộc vào kiến ​​trúc thực tế và cả hai loại hiện tại xung quanh.

+0

Đối số mẫu của bạn biến mất vì chúng giống như thẻ HTML, sử dụng đánh dấu đúng nguyên văn (backticks) để ngăn chặn điều đó. Ngoài ra, tôi chắc chắn rằng mức tối thiểu được đảm bảo của bạn cho 'std :: numeric_limits :: chữ số' quá cao. –

+0

'std :: numeric_limits :: digits> = 16', true. Nhưng câu trả lời của bạn đã ký các loại và 'chữ số' được chỉ định là **" Đối với các loại số nguyên, số bit không dấu trong biểu diễn. "** –

23

đồng bằng int được ký kết, có hay không đó là kích thước giống như long int là nền tảng phụ thuộc.

Có gì đảm bảo là

sizeof (int) <= sizeof (long) 

int là đủ lớn để nắm giữ ít nhất tất cả các giá trị từ -32.767 đến 32767.


gì tiêu chuẩn nói: (phần [basic.fundamental]:

Có năm loại số nguyên được ký tiêu chuẩn: signed char , short int, int, long intlong 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 int s 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.

+7

+1, Đối với người đọc khác: có một chi tiết quan trọng trong câu đầu tiên: 'int' và' signed long int' là ** không bao giờ ** cùng * loại *, nhưng chúng có thể có cùng * kích thước *. –

6

Đồng bằng int tương đương với signed int. Đó là tiêu chuẩn. Bất cứ điều gì quá khứ không được bảo đảm; intlong là các loại khác nhau, ngay cả khi trình biên dịch cụ thể của bạn làm cho chúng có cùng kích thước. Bảo đảm duy nhất bạn có là số longít nhất lớn bằng int.

4

Các longshort công cụ sửa đổi không chính xác như signedunsigned. Hai thứ hai có thể được đặt vào bất kỳ loại số nguyên nào, nhưng nếu bạn để nguyên chúng, thì signedmặc định cho mỗi loại số nguyên (ngoại trừ char). Vì vậy, intsigned int là cùng loại.

Đối với longshort, nếu bạn bỏ chúng, không được chọn, nhưng loại kết quả thì khác. long int, short intint là tất cả các loại khác nhau, với short int < = int < = long int.

Các int sau long, short, signedunsigned là không bắt buộc: signed intsigned là cùng loại.

1

signedint đều giống như signed int theo mặc định.

Không có cùng loại với signed short int hoặc signed long int.

2

Trong C++ intsigned int theo mặc định, do đó, không có vấn đề gì với điều đó. Tuy nhiên, intlong int là các loại khác nhau trong C++, do đó, điều này không giống với quan điểm của ngôn ngữ. Việc triển khai intlong int là nền tảng/trình biên dịch cụ thể - chúng là cả hai loại không thể tách rời có thể giống hệt nhau. Giới hạn C++ giới hạn chỉ áp dụng là sizeof(long int) >= sizeof(int).

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