整數

整數資料型態

有正負符號

因為最左邊第1位bit作為正負符號,所以bit都少1個,比如short有2byte,2byte總共是16bit,最左邊作為正負符號,所以變成15bit,正數範圍$2 ^{15} - 1$,其中的-1是減掉0這個數字。

整數型態 占用Byte數量 格式字串 範圍 範圍
short 2 %hd $-2 ^{15}$ 至 $2 ^{15} - 1$ -32,768 至 32,767
int 4 %d $-2 ^{31}$ 至 $2 ^{31} - 1$ -2,147,483,648 至 2,147,483,647
long 4 %ld $-2 ^{31}$ 至 $2 ^{31} - 1$ -2,147,483,648 至 2,147,483,647
long long 8 %lld $-2 ^{63}$ 至$2 ^{63} - 1$ -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807

signed代表有正負符號。
signed int 與 int是相同的。
signed long與 long是相同的。

只有正數

大小為正負符號的正數大小2倍,再加1,例:short正負符號,正數最大為32767,unsigned short最大為32767 * 2 = 65534 + 1

整數型態 占用Byte數量 格式字串 範圍 範圍
unsinged short 2 %hu $2 ^{16} - 1$ 0 到 65,535
unsinged int 4 %u $2 ^{32} - 1$ 0 到 4,294,967,295
unsinged long 4 %ud $2 ^{32} - 1$ 0 到 18,446,744,073,709,551,615
unsinged long long 8 %llu $2 ^{64} - 1$ 0 到 18,446,744,073,709,551,615

格式化

整數型態 格式化
int %d
long %ld
long long %lld
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
  // 把double轉int,小數直接去掉
  int num = 20.856;
  // 印出整數
  printf("%d \n", num);
  // 印出long最大值
  long num1 = 2147483647;
  printf("%ld \n", num1);
  // 印出long long最小值
  long long num2 = -9223372036854775808;
  printf("%lld \n", num2);
  return 0;
}
20 
2147483647 
-9223372036854775808 

自動轉型

有正負符號由小到大排序如下:

short → int → long → long long

正負符號與正數混合,由小到大排序如下:

short → unsinged short → int → unsinged int → long → unsinged long → long long → unsinged long long

char在c++也是整數,占1byte。
以下是自動轉型,小的可以自動轉成大的,以下由小到大排序,因為long與float比較二者大小的過程太複雜,我直接分成二部分,最終它們都能自動轉型成double。(不要糾結float指數是怎麼儲存)

char → short → int → long → double
                    float → double

整數大小

1
cout << "size of int = " << sizeof(8) << endl;
執行結果
size of int = 4

由大轉小可以,資料會丟失,會出現警告

在C與C++,可以由大轉小,只是會出現精度會遺失的警告。
但在Java,無法由大轉小,編譯器會出現error。

以下程式碼把double轉成int,小數點直接去掉。

1
2
3
4
5
6
7
int main() {
  // 把double轉int,小數直接去掉
  int num = 20.856;
  // 印出小數點3位
  printf("%d", num);
  return 0;
}
20

整數相除,去掉小數點,只留正數,不會四捨五入

1
cout << "8/5 = " << 8/5 << endl;
執行結果
8/5 = 1

運算式中有低精準度與高精準度,低精準度會自動轉成高精準度,不需要強制轉型。

1
2
3
4
char c7 = 97;
int i1 = 25;
long long llong1 = 150000000000LL;
cout << "97 + 25 + 150000000000 = " << c7 + i1 + llong1 << endl;
執行結果
97 + 25 + 150000000000 = 150000000122

等號(=)左邊是高精準度,右邊是低精準度,低精準度會自動轉成高精準度,不需要強制轉型。

1
2
3
char c7 = 97;
int i2 = c7;
cout << "i2 = " << i2 << endl;
執行結果
i2 = 97

等號(=)左邊是整數,右邊是浮點數,浮點數小數點直接去掉,轉換成整數。

1
2
int i3 = 23.9999999;
cout << "i3 = " << i3 << endl;
執行結果
i3 = 23

等號(=)右邊超出範圍。

unsigned int最大的值是4294967295。

1
2
3
4
5
6
unsigned int ui1 = 4294967295u;
unsigned int ui2 = 4294967295u + 1;
unsigned int ui3 = 4294967295u + 2;
cout << "ui1 = " << ui1 << endl;
cout << "ui2 = " << ui2 << endl;
cout << "ui3 = " << ui3 << endl;
執行結果
ui1 = 4294967295
ui2 = 0
ui3 = 1

unsigned int最大的值是4294967295,若超出的二進位會被去掉。

超出的二進位 二進位 十進位 輸出結果
  11111111 11111111 11111111 11111111 4294967295 4294967295
00000001 00000000 00000000 00000000 00000000 4294967295 + 1 0
00000001 00000000 00000000 00000000 00000001 4294967295 + 2 1

results matching ""

    No results matching ""