c言語の基本データ型の範囲(網羅性は微妙)


# はじめに
型の範囲に悩まされることがあるので、**「OSによって型の範囲が変わる」**という部分も含め、ここに忘備録も兼ねてまとめます。ソースは大学の講義といくつかのサイトです。

# OSの種類と型の範囲(基本データ型)
C言語の規格では、short ≤ int ≤ long ≤ long long という大小関係が定められているのみで、ビット幅は処理系に依存します。ほとんどのパソコンはここに挙げているもののどれかに当てはまるはずです。

## 16bit OS

|   |char|short|int|long|long long|ポインタ|
|:--|:--:|:---:|:-:|:--:|:-------:|:-----:|
|   |8   |16   |16 |32  |-        |16     |

## 32bit OS

|         |char|short|int|long|long long|ポインタ|コメント(推測)|
|:--------|:--:|:---:|:-:|:--:|:-------:|:-----:|:-----|
|**ILP32**|8   |16   |32 |32  |64       |32     |**I**ntと**L**ongと**P**ointerが**32**bit| 
|**LP32** |8   |16   |16 |32  |64       |32     |**L**ongと**P**ointerが**32**bit| 

## 64bit OS

|         |char|short|int|long|long long|ポインタ|コメント(推測)|
|:--------|:--:|:---:|:-:|:--:|:-------:|:-----:|:-----|
|**LLP64**|8   |16   |32 |32  |64       |64     |**L**ong **L**ongと**P**ointerが**64**bit ※Windows64bit| 
|**LP64** |8   |16   |32 |64  |64       |64     |**L**ong以降と**P**ointerが**64**bit ※Unix| 
|**IP64** |8   |16   |64 |64  |64       |64     |**I**nt以降と**P**ointerが**64**bit| 


#基本データ型モデルの判定

## 実行環境
cygwin 3.0.7-1
Surface Pro4

## ソースコード
``` c
#include <stdio.h>

int main(void){
  if(sizeof(char*)==4){
    if(sizeof(int)==sizeof(long)){
      printf("I");
    }
    printf("LP32\n");
  }else if(sizeof(char*)==8){
  if(sizeof(long)!=sizeof(long long)){
      printf("LL");
    }else if(sizeof(int)!=sizeof(long)){
      printf("L");
    }else{
      printf("I");
    }
    printf("P64\n");
  }else{
    printf("Error!\n");
  }
}
```
## 実行結果(例)
```
$ ./a.exe
LP64
```
# 型の範囲

|ビット幅|計算式             |範囲                                     |
|:-----:|:-----------------:|:--------------------------------------:|
|8      |$$ -2^7～2^7-1   $$|-128〜127                                |
|16     |$$ -2^{15}～2^{15}-1 $$|-32768〜32767                            |
|32     |$$ -2^{31}～2^{31}-1 $$|-2147483648〜2147483647                  |
|64     |$$ -2^{63}～2^{63}-1 $$|-9223372036854775808〜9223372036854775807|

## 16bitOS

|         |ビット幅|範囲                   |指定子   |
|:--------|:-----:|:---------------------:|:------:|
|char     |8      |-128〜127              |%c      |
|short    |16     |-32768〜32767          |%d      |
|int      |16     |-32768〜32767          |%d      |
|long     |32     |-2147483648〜2147483647|%ld     |
|long long|-      |-                      |%lld    |
|pointer  |16     |-32768〜32767          |%n or %p|

## ILP32(多くの32bit処理系)

|         |ビット幅|範囲                                    |指定子   |
|:--------|:-----:|:---------------------------------------:|:------:|
|char     |8      |-128〜127                                |%c      |
|short    |16     |-32768〜32767                            |%d      |
|int      |32     |-2147483648〜2147483647                  |%d      |
|long     |32     |-2147483648〜2147483647                  |%ld     |
|long long|64     |-9223372036854775808〜9223372036854775807|%lld    |
|pointer  |32     |-2147483648〜2147483647                  |%n or %p|

## LP32

|         |ビット幅|範囲                                    |指定子   |
|:--------|:-----:|:---------------------------------------:|:------:|
|char     |8      |-128〜127                                |%c      |
|short    |16     |-32768〜32767                            |%d      |
|int      |16     |-32768〜32767                            |%d      |
|long     |32     |-2147483648〜2147483647                  |%ld     |
|long long|64     |-9223372036854775808〜9223372036854775807|%lld    |
|pointer  |32     |-2147483648〜2147483647                  |%n or %p|

## LLP64(Windows64bit)

|         |ビット幅|範囲                                    |指定子   |
|:--------|:-----:|:---------------------------------------:|:------:|
|char     |8      |-128〜127                                |%c      |
|short    |16     |-32768〜32767                            |%d      |
|int      |32     |-2147483648〜2147483647                  |%d      |
|long     |32     |-2147483648〜2147483647                  |%ld     |
|long long|64     |-9223372036854775808〜9223372036854775807|%lld    |
|pointer  |64     |-9223372036854775808〜9223372036854775807|%n or %p|

## LP64(Unix系OS)

|         |ビット幅|範囲                                    |指定子   |
|:--------|:-----:|:---------------------------------------:|:------:|
|char     |8      |-128〜127                                |%c      |
|short    |16     |-32768〜32767                            |%d      |
|int      |32     |-2147483648〜2147483647                  |%d      |
|long     |64     |-9223372036854775808〜9223372036854775807|%ld     |
|long long|64     |-9223372036854775808〜9223372036854775807|%lld    |
|pointer  |64     |-9223372036854775808〜9223372036854775807|%n or %p|

## IP64

|         |ビット幅|範囲                                    |指定子   |
|:--------|:-----:|:---------------------------------------:|:------:|
|char     |8      |-128〜127                                |%c      |
|short    |16     |-32768〜32767                            |%d      |
|int      |64     |-9223372036854775808〜9223372036854775807|%d      |
|long     |64     |-9223372036854775808〜9223372036854775807|%ld     |
|long long|64     |-9223372036854775808〜9223372036854775807|%lld    |
|pointer  |64     |-9223372036854775808〜9223372036854775807|%n or %p|

# 参考サイト
- 【C言語/C++】データ型のサイズ・範囲の一覧【32bit/64bit環境】 | MaryCore
https://marycore.jp/prog/c-lang/data-type-ranges-and-bit-byte-sizes/#ano-data-models
- C言語 - Wikipedia 
https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E#C%E8%A8%80%E8%AA%9E%E3%81%AE%E8%A6%8F%E6%A0%BC