teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加

2020/09/08 09:39

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -2,4 +2,42 @@
2
2
  intの範囲を超えるサイズのものの場合、自動的に、long、long longと型が拡張されます。
3
3
  long longでも扱えないサイズのリテラルはエラーになります。
4
4
 
5
- 8進数や16進数表記の場合には、int、unsigned int、long、unsigned long、long long、unsigned long longと、unsignedを含めて自動的に拡大されるようです。
5
+ 8進数や16進数表記の場合には、int、unsigned int、long、unsigned long、long long、unsigned long longと、unsignedを含めて自動的に拡大されるようです。
6
+
7
+ なので、`0x8000`と書いた場合、一般的な環境では、`int`(32bit)の範囲内に収まるので、intになります。
8
+ 16bitのintが標準である16bit環境のC言語の場合には、上の法則に合わせて`unsigned int`(16bit)になるかと思われます。
9
+
10
+ 標準的なintよりも小さなサイズの数値は全てintとなり、自動的に、shortやcharになることはありません。
11
+
12
+ ちょっとした実験。
13
+ ```C
14
+ #include <stdio.h>
15
+ int main(void){
16
+ printf("int :%lu\n",sizeof(int));
17
+ printf("long :%lu\n",sizeof(long));
18
+ printf("long long :%lu\n",sizeof(long long));
19
+
20
+ printf("1 :%lu\n",sizeof(1));
21
+ printf("1K :%lu\n",sizeof(1000));
22
+ printf("1M :%lu\n",sizeof(1000000));
23
+ printf("1G :%lu\n",sizeof(1000000000));
24
+ printf("1T :%lu\n",sizeof(1000000000000));
25
+ printf("1P :%lu\n",sizeof(1000000000000000));
26
+ printf("1E :%lu\n",sizeof(1000000000000000000));
27
+ // printf("100E :%lu\n",sizeof(100000000000000000000)); エラー
28
+
29
+ }
30
+ ```
31
+ 型のサイズは環境によって変わります。
32
+ ```output
33
+ int :4
34
+ long :8
35
+ long long :8
36
+ 1 :4
37
+ 1K :4
38
+ 1M :4
39
+ 1G :4
40
+ 1T :8
41
+ 1P :8
42
+ 1E :8
43
+ ```