2012-09-05 123 views
14

C中short int(或short)和int是不同的?他們有相同的大小和範圍。如果它們基本相同,那麼使用兩種數據類型有什麼用處?C中的「short int」和「int」有什麼區別?

+0

在16位的編譯器,它們具有相同的尺寸和範圍。實際上,所有適用於主流平臺的現代編譯器都有'sizeof(int)> sizeof(short)'。 –

回答

22

他們可能具有相同的大小,但保證int等於或大於short int

+3

什麼實際保證的是,*範圍的'*短int'至少-32767 ... +32767,和'短int'範圍int'的'範圍的一個子集。由此可見,「short int」和「int」都至少爲16位。由於填充位,理論上可以使用sizeof(short int)> sizeof(int)',但這是不太可能的。 –

+1

@KeithThompson可以詳細說明sizeof(short int)> sizeof(int)'嗎? – SomeWittyUsername

+1

@icepack:整數類型可以有填充位,這些位不會影響值。例如,一個符合的實現可能在理論上具有32位(16位填充位)和24位(全部有效)的「短」。我想不出有什麼理由去做這樣愚蠢的事情,但標準並不禁止它。 –

0

「在一個編程語言中的短整型可以以不同的語言或在不同的處理器具有不同的尺寸 。在某些語言 這個大小是固定的跨平臺,而在其他情況是 機器相關。在某些語言中,該數據類型不存在於 全部。「

Source

+0

但問題是關於C. –

+0

Yup和發佈的源代碼鏈接顯示了C,C++,C#和Java的區別。 – Ljdawson

+0

您引用的部分不回答問題。 '(順便說一句,那款後來從文章中刪除。) –

1

這取決於系統。有些操作系統對於這兩種類型的長度都不一樣。

3

永遠不要依賴C中給定大小的數據類型。如果有疑問,請務必檢查limits.h中的邊界。

+0

除,當然,如果你使用'uint32_t'和朋友'。 – unwind

+1

這是C99標準的一部分,它將我們帶回到其他人提出的使用OS /編譯器的問題。 –

0

其實一切都取決於編譯器和系統。但基本規則說int總是不能小於short,永遠不會比long長。

短< = INT < =長

+1

char <= short? – cdarke

+1

char <= short <= int <= long <= long long。需要注意的是長長的[ISO C90]不支持(https://en.wikipedia.org/wiki/ANSI_C) – Ultimater

14

理論上/ C標準,它們可以是任何尺寸的,只要short <= int

在現實世界中,尺寸是如何實現的。

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

你有沒有在64位選中它在ANSI C在Linux在64位和Visual Studio中的窗口,我只是想知道.. –

+2

@BharatSharma 64位只對「長」和「長長」的尺寸有所不同。顯然,一些64位系統定義長達64位,而其他系統實現C99/C11標準,並使用「long long」表示64位,long表示32位。 – Lundin

+0

感謝實際上,一旦我發現相關問題很長,所以我想這也許可以縮短... :) –

1

C99 N1256 standard draft

所有我們現在可以肯定的是:整數類型的

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

5.2.4.2.1尺寸<limits.h>給出了最小規格:

1 [...] Thei ř實現定義的值必須在大小(絕對值)等於或大於示出的那些[...]

  • UCHAR_MAX 255 // 2月8日至1日
  • USHRT_MAX 65535 //二月16日至1日
  • UINT_MAX 65535 //二月十六日至一日
  • ULONG_MAX 4294967295 // 2 32 - 1
  • 18446744073709551615 ULLONG_MAX // 2 64 - 1

6.2。5種類型然後說:

8對於任何兩個整數類型與相同的符號性和不同的整數轉換秩 (見6.3.1.1),具有更小的整數轉換等級的類型的值的範圍是 其他類型的值的子範圍。

6.3.1.1布爾,字符,和整數確定相對排名轉換:

1的每一個整數類型具有限定的整數轉換等級如下:

  • 的長長整型的秩應大於長整型的秩,其 應大於INT的秩更大,這應是比短 INT的秩時,WHI更大ch應大於簽名字符的等級。如果任何
  • 任何無符號整數類型的秩必須等於相應 符號整型的秩。
  • 對於所有整數類型T1,T2,和T3,如果T1具有大於T2秩和T2具有 大於T3秩,則T1具有比T3
  • 更大秩
0

我正在工作的今天一樣。我的結論是,它取決於你的程序執行的機器體系結構的字長。 根據C99 limits.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 

讓我知道是否有人有更好的答案。

+0

只需添加試試 –

+0

short int i = 2147483647; printf(「%d%d%d \ n」,i,i + 1,i + 10); –

+0

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

相關問題