2012-09-05 56 views
14

Làm thế nào là ngắn int (hoặc ngắn) và int khác nhau trong C? Họ có cùng kích thước và phạm vi. Nếu về cơ bản chúng giống nhau, việc sử dụng hai loại dữ liệu là gì?Sự khác nhau giữa "int ngắn" và "int" trong C là gì?

+0

Trong trình biên dịch 16 bit, chúng có cùng kích thước và dải ô. Thực tế tất cả các trình biên dịch hiện đại cho các nền tảng chính thống có 'sizeof (int)> sizeof (viết tắt)'. –

Trả lời

22

Họ có thể có cùng kích thước, nhưng đảm bảo rằng int bằng hoặc lớn hơn short int.

+3

Điều thực sự được đảm bảo là * phạm vi * của 'short int' ít nhất là -32767 .. +32767 và phạm vi' int 'ngắn là một tập con của phạm vi' int'. Nó bắt nguồn từ điều này mà 'int' ngắn và 'int' đều là ít nhất 16 bit. Do các bit đệm, về mặt lý thuyết có thể có 'sizeof (short int)> sizeof (int)', nhưng rất khó xảy ra. –

+1

@KeithThompson bạn có thể giải thích về 'sizeof (int ngắn)> sizeof (int)'? – SomeWittyUsername

+1

@icepack: Các loại số nguyên có thể có các bit đệm, các bit không đóng góp vào giá trị. Ví dụ, một thực hiện phù hợp có thể * theo lý thuyết * có 'short' với 32 bit (16 bit của chúng) và' int' với 24 bit (tất cả là quan trọng). Tôi không thể nghĩ ra bất kỳ lý do nào để làm một điều ngớ ngẩn như vậy, nhưng tiêu chuẩn không cấm nó. –

0

"Một số nguyên ngắn trong một ngôn ngữ lập trình có thể là một kích thước khác nhau bằng một ngôn ngữ khác nhau hoặc trên một bộ xử lý khác nhau. Trong một số ngôn ngữ kích thước này là cố định trên nền tảng, trong khi ở những người khác nó là máy phụ thuộc vào Trong một số ngôn ngữ, kiểu dữ liệu này không tồn tại ở tất cả. "

Source

+0

Nhưng câu hỏi là về C. –

+0

Yup và liên kết nguồn được đăng cho thấy sự khác biệt cho C, C++, C# và Java. – Ljdawson

+0

Phần bạn trích dẫn không trả lời câu hỏi. (BTW, đoạn đó sau đó đã bị xóa khỏi bài viết.) –

1

Nó phụ thuộc vào hệ thống. Một số hệ điều hành sẽ không có cùng độ dài cho cả hai loại.

3

Không bao giờ dựa vào kiểu dữ liệu là một kích thước nhất định trong C. Luôn kiểm tra giới hạn trong giới hạn.h nếu nghi ngờ.

+0

Ngoại trừ, tất nhiên, nếu bạn đang sử dụng 'uint32_t' và bạn bè từ ''. – unwind

+1

Đó là một phần của tiêu chuẩn C99 đưa chúng ta trở lại câu hỏi được đưa ra bởi những người khác lại những gì OS/trình biên dịch đang được sử dụng. –

0

Thực ra mọi thứ đều phụ thuộc vào trình biên dịch và cả hệ thống. Nhưng quy tắc cơ bản nói rằng int không bao giờ có thể ngắn hơn và không bao giờ có thể dài hơn.

ngắn < = int < = dài

+1

char <= short? – cdarke

+1

char <= short <= int <= long <= dài. Lưu ý rằng lâu dài không được hỗ trợ trong [ISO C90] (https://en.wikipedia.org/wiki/ANSI_C) – Ultimater

14

Về lý thuyết/theo tiêu chuẩn C, họ có thể là của bất kỳ kích thước chừng nào short <= int.

Trong thế giới thực, đây là cách các kích thước được triển khai.

CPU    short int 
8 bit   16  16 
16 bit   16  16 
32 bit   16  32 
64 bit   16  32 
+0

Bạn đã kiểm tra nó trong ansi c trong linux trong 64 bit và studio trực quan trong cửa sổ trong 64 bit tôi chỉ muốn biết .. –

+2

@BharatSharma 64 bit chỉ tạo sự khác biệt với kích thước của 'long' và' long long'.Rõ ràng một số hệ thống 64 bit xác định dài 64 bit, trong khi các hệ thống khác thực hiện chuẩn C99/C11 và sử dụng 'long long' cho 64 bit, để' dài' là 32 bit. – Lundin

+0

cảm ơn thực sự một khi tôi tìm thấy vấn đề liên quan đến lâu vì vậy tôi đã suy nghĩ rằng cũng có thể có thể ngắn ... :) –

1

C99 N1256 standard draft

Tất cả những gì bây giờ cho chắc chắn chúng tôi là:

2 <= sizeof(short) <= sizeof(int) 

5.2.4.2.1 kích cỡ của các loại nguyên <limits.h> cho các kích thước tối thiểu:

1 [...] Thei r giá trị thực hiện xác định được tính bằng hoặc lớn hơn trong độ lớn (giá trị tuyệt đối) cho những thể hiện [...]

  • UCHAR_MAX 255 // 08-ngày 01 tháng 2
  • USHRT_MAX 65535 // 16-ngày 01 tháng 2
  • UINT_MAX 65535 // ngày 16-ngày 01 tháng 2
  • ULONG_MAX 4294967295 // 2 32-1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2.5 loại sau đó nói:

8 Đối với bất kỳ hai loại nguyên với signedness giống nhau và khác nhau rank chuyển đổi số nguyên (xem 6.3.1.1), phạm vi của các giá trị của các loại với cấp bậc chuyển đổi số nguyên nhỏ hơn là một sắp xếp các giá trị của loại khác.

6.3.1.1 Boolean, ký tự, và số nguyên xác định chuyển đổi tương đối đứng:

1 Mỗi kiểu dữ liệu integer có rank chuyển đổi số nguyên quy định như sau:

  • Các xếp hạng của int dài dài sẽ lớn hơn xếp hạng của int dài, trong đó phải lớn hơn thứ hạng của int, mà phải lớn hơn xếp hạng ngắn int, whi ch sẽ lớn hơn xếp hạng char đã ký.
  • Thứ hạng của bất kỳ loại số nguyên không dấu nào sẽ bằng với thứ hạng của loại số nguyên tương ứng đã ký, nếu có.
  • Đối với tất cả các loại nguyên T1, T2 và T3, nếu T1 có thứ tự lớn hơn T2 và T2 có thứ tự lớn hơn T3, sau đó T1 có thứ tự lớn hơn T3
0

Tôi đã làm việc trên cùng ngày hôm nay. Kết luận của tôi là nó phụ thuộc vào độ dài từ của kiến ​​trúc máy mà chương trình của bạn đang được thực thi. Theo tài liệu giới hạn C99.h.

/* Minimum and maximum values a `signed short int' can hold. */ 
# define SHRT_MIN (-32768) 
# define SHRT_MAX 32767 

/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */ 
# define USHRT_MAX 65535 

/* Minimum and maximum values a `signed int' can hold. */ 
# define INT_MIN (-INT_MAX - 1) 
# define INT_MAX 2147483647 

/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */ 
# define UINT_MAX 4294967295U 

/* Minimum and maximum values a `signed long int' can hold. */ 
# if __WORDSIZE == 64 
# define LONG_MAX 9223372036854775807L 
# else 
# define LONG_MAX 2147483647L 
# endif 
# define LONG_MIN (-LONG_MAX - 1L) 

/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */ 
# if __WORDSIZE == 64 
# define ULONG_MAX 18446744073709551615UL 
# else 
# define ULONG_MAX 4294967295UL 
# endif 

Hãy cho tôi biết nếu có ai có câu trả lời tốt hơn.

+0

chỉ để thêm thử này –

+0

ngắn int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –

+0

int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –

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