我一直在互聯網上閱讀一些定義,通常是這樣說的,例如: “……因為在大多數計算機上,“int”資料型別是 2 個位元組,或 16 位,它只能存盤 2^16 個數字……”
和
“……而且由于 2^16=65535,它只能容納那么多數字……” - 對于 unsigned int
我還在一些網站上看到 int 變數可以容納的最大值是"2,147,483,647"。然后我一直在思考數字65535和數字2,147,483,647之間的關系。
我做了一些測驗,我看到我可以存盤的最大值實際上是一個 int 變數中的 2,147,483,647,那么,65535 究竟意味著什么?
鏈接:https : //www.quora.com/The-range-of-int-data-type-Is-32768-to-32767-What-does-this-actually-mean-What-range-of-numbers- I-can-store-in-int
uj5u.com熱心網友回復:
an 的大小int不一定在所有實作上都相同。
C 標準規定 an 的范圍int必須至少為 -32767 到 32767,但也可以更大。在您可能會接觸到的大多數系統上, an 的int范圍是 -2,147,483,648 到 2,147,483,647,即 32 位二進制補碼表示。
uj5u.com熱心網友回復:
16 位可以有一定數量的唯一組合(有關此解釋,請參見此處)。要計算出這個數字,您只需要將 2 的位數進行乘方即可。2^16 是 65536。由于從零開始計數,這意味著 65535 是最大值。不過,這是一個無符號整數。
有符號整數使用其中一位來確定數字是正數還是負數(這稱為Two's Complement)。這意味著只有 15 位可以用來表示數字。2^15 是 32768,意思是在正方向,數字可以從 0 到 32767。在負方向,最小的數字是 -32768。組合的總數仍然是 65536,但在有符號的 16 位整數的情況下,這些位只是意味著不同的東西。
對于 32 位整數,邏輯完全相同。2^32 是 4294967296,這意味著 32 位數字的最高值是 4294967295。正好有 2^32 種可能的組合,但因為它從零開始,所以最高數字正好比 2^32 小 1。但是如果你為符號保留一位,那意味著你只能上升到 2^31 減一,即 2147483648。因此,使用與 16 位數字相同的邏輯,我們可以計算出最高的 a有符號的 32 位整數可以走是 2147483647,最低可以走是 -2147483648。
至于哪些資料型別使用 8、16、32 或 64 位,那是平臺相關的。一個int是這些天幾乎都是32位的,但是這并不總是如此。如果您希望資料型別具有有保證的大小,則必須專門選擇具有明確大小的資料型別。在 C 中,這可以使用中定義的型別來完成stdint.h。例如,uint32_t將是一個 32 位的無符號整數,這意味著在任何平臺上,您都可以保證它可以達到的最高值是 4294967295。
uj5u.com熱心網友回復:
在計算機的歷史上,位元組和字的大小變化很大。你并不總是有一個由 8 位位元組、16 位字、32 位長字等組成的整潔系統。在 1970 年代早期開發 C 時,你有 9 位位元組和 36 位字的系統,根本不是位元組尋址的系統,超過 40 位的字大小,等等。類似地,一些系統有填充或保護位,這些位對表示值沒有貢獻 - 你可以有一個 18 位型別仍然只能表示 2 16 個值。使所有字大小為 2 的冪很方便,但這不是必需的。
由于情況有些變化,C 語言標準只規定了一個型別必須能夠表示的值的最小范圍。 signed char必須至少能夠表示range -127...127,因此它必須至少有8 位寬。Ashort必須至少能夠表示range -32767...32767,因此它必須至少為16 位寬,等等。此外,有符號整數的表示也各不相同 - 二進制補碼是最常見的,但您也有符號大小和一個補充表示,它編碼兩個零值(正和負) - 這就是范圍不從-2N-1 to 2N-1-1. 然后各個實作將這些范圍映射到硬體提供的本機字大小。
現在,指定這些特定范圍并非偶然——大多數硬體已經在使用 8 位位元組、16 位字、32 位長字等。C 的許多抽象(包括型別大小和行為)都基于什么硬體已經提供。
int有點特殊 - 它只需要至少表示 range -32767...32767,但它通常也設定為與本機字大小相同,自 80 年代后期以來,大多數平臺上都是 32 位。
要查看您平臺上的實際范圍,您可以查看<limits.h>. 這是一個我想出來的小程式,用來展示我的系統上的一些尺寸定義:
#include <stdio.h>
#include <limits.h>
#define EXP(x) #x
#define STR(x) EXP(x)
#define DISPL(t,m) printf( "0s = %2zu, s = 5s\n", "sizeof(" #t ")", sizeof(t), #m, STR(m) )
#define DISPL2(t,m1,m2) printf( "0s = %2zu, s = 5s, s = 5s\n", "sizeof(" #t ")", sizeof(t), #m1, STR(m1), #m2, STR(m2) )
int main( void )
{
DISPL(char, CHAR_BIT);
DISPL2(char, CHAR_MIN, CHAR_MAX);
DISPL2(signed char, SCHAR_MIN, SCHAR_MAX);
DISPL(unsigned char, UCHAR_MAX);
DISPL2(short, SHRT_MIN, SHRT_MAX);
DISPL(unsigned short, USHRT_MAX);
DISPL2(int, INT_MIN, INT_MAX);
DISPL(unsigned int, UINT_MAX );
DISPL2(long, LONG_MIN, LONG_MAX );
DISPL(unsigned long, ULONG_MAX );
DISPL2(long long, LLONG_MIN, LLONG_MAX );
DISPL(unsigned long long, ULLONG_MAX );
return 0;
}
結果如下:
$ ./sizes
sizeof(char) = 1, CHAR_BIT = 8
sizeof(char) = 1, CHAR_MIN = (-127-1), CHAR_MAX = 127
sizeof(signed char) = 1, SCHAR_MIN = (-127-1), SCHAR_MAX = 127
sizeof(unsigned char) = 1, UCHAR_MAX = (127*2 1)
sizeof(short) = 2, SHRT_MIN = (-32767 -1), SHRT_MAX = 32767
sizeof(unsigned short) = 2, USHRT_MAX = (32767 *2 1)
sizeof(int) = 4, INT_MIN = (-2147483647 -1), INT_MAX = 2147483647
sizeof(unsigned int) = 4, UINT_MAX = (2147483647 *2U 1U)
sizeof(long) = 8, LONG_MIN = (-9223372036854775807L -1L), LONG_MAX = 9223372036854775807L
sizeof(unsigned long) = 8, ULONG_MAX = (9223372036854775807L *2UL 1UL)
sizeof(long long) = 8, LLONG_MIN = (-9223372036854775807LL-1LL), LLONG_MAX = 9223372036854775807LL
sizeof(unsigned long long) = 8, ULLONG_MAX = (9223372036854775807LL*2ULL 1ULL)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/331922.html
標籤:C
