> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/c/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/c/ji-chu/zheng-shu-ff08-short-int-long.md).

# 整数（short,int,long）

现代操作系统中 int 一般占用4个字节内存，共计32位（Bit）。

让整数占用更少的内存可以在 int 前边加 **short**，让整数占用更多的内存可以在 int 前边加**long**，例如：

```c
short int a = 10;
short int b, c = 99;
long int m = 102023;
long int n, p = 562131;
```

这样 a、b、c 只占用2个字节的内存，而 m、n、p 可能占用8个字节的内存。

也可以将 int 省略，只写 short 和 long，如下所示：

```c
short a = 10;
short b, c = 99;
long m = 102023;
long n, p = 562131;
```

这样的写法更加简洁，实际开发中常用。

总结起来，C语言中共有三种整数类型，分别是 short、int 和 long。int 称为整型，short 称为短整型，long 称为长整型。

### 整数的长度

C语言并没有严格规定 short、int、long 所占用的字节数，只做了宽泛的限制：

* short 至少占用2个字节。
* long 建议为一个机器字长。32位环境下机器字长为4字节，64位环境下机器字长为8字节。
* short 的长度不能大于 int，long 的长度不能小于 int。

对于32位的 Windows、Linux 和 OS X，short 为2个字节，int 为4个字节，long 也为4个字节。PC和服务器上的32位系统占有率也在慢慢下降，嵌入式系统使用32位越来越多。

在64位环境下，不同的操作系统会有不同的结果，如下所示（长度以字节计）：

| 操作系统                                      | short | int | long |
| ----------------------------------------- | ----- | --- | ---- |
| Win64                                     | 2     | 4   | 4    |
| 类Unix系统（包括 Unix、Linux、OS X、BSD、Solaris 等） | 2     | 4   | 8    |

目前我们使用较多的PC系统为 Win XP、Win 7、Win 8、Win 10、Mac OS X、Linux，short 和 int 的长度都是固定的，分别为2和4，大家可以放心使用，long 的长度在 Win64 和类Unix系统下会有所不同，使用时要注意移植性。

获取某个数据类型的长度可以使用 sizeof 操作符，如下所示：

```c
#include <stdio.h>
int main()
{
    short a = 10;
    int b = 100;
    long c = 1000;
    char d = 'X';

    int a_length = sizeof a;
    int b_length = sizeof(int);

    printf("a=%d, b=%d, c=%d, d=%d\n", a_length, b_length, sizeof(c), sizeof(char));

    return 0;
}
```

在Win7下的运行结果为：

```
a=2, b=4, c=4, d=1
```

sizeof 用来获取某个数据类型或变量所占用的字节数，如果后面跟的是变量名称，那么可以省略`( )`，如果跟的是数据类型，就必须带上`( )`。

\
**需要注意的是，sizeof 是C语言中的操作符，不是函数，所以可以不带**`( )`**。**

## 不同进制的整数

C语言中的整数除了可以使用十进制，还可以使用八进制和十六进制。

#### 1) 八进制

八进制由 0\~7 八个数字组成，使用时必须以`0`开头（注意是数字 0，不是字母 o），例如：

```c
//合法的八进制数
int a = 015;  //十进制为 13
int b = -0101;  //十进制为 -65
int c = 0177777;  //十进制为 65535

//非法的八进制
int m = 256;  //无前缀 0，相当于十进制
int n = 03A2;  //A不是有效数字
```

#### 2) 十六进制

十六进制由数字 0\~9、字母 A\~F 或 a\~f 组成，使用时必须以`0x`或`0X`（不区分大小写）开头，例如：

```c
//合法的十六进制
int a = 0X2A;  //十进制为 42
int b = -0XA0;  //十进制为 -160
int c = 0xffff;  //十进制为 65535

//非法的十六进制
int m = 5A;  //无前缀 0X
int n = 0X3H;  //H不是有效数字
```

#### 3) 十进制

十进制由 0\~9 十个数字组成，没有任何前缀，和我们平时的书写格式一样，不再赘述。

**注意：C语言中只能使用八进制、十进制和十六进制，不能直接使用二进制，它没有特定的前缀。**

各种整数的输出

在使用 printf 输出整数时，不同的控制字符会有不同的输出格式。

1\) 输出 int 使用`%d`，输出 short 使用`%hd`，输出 long 使用`%ld`。请看下面的例子：

```c
#include <stdio.h>
int main()
{
    short a = 100;
    int b = 010;
    long c = 0XFFFF;
    printf("a=%hd, b=%d, c=%ld\n", a, b, c);

    return 0;
}
```

运行结果：

```
a=100, b=8, c=65535
```

2\) 输出十进制使用`%d`，输出八进制使用`%o`（注意是字母 o，不是数字 0），输出十六进制使用`%x`或`%X`。如果希望带上前缀，可以加`#`，例如 %#d、%#o、%#x、%#X。请看下面的例子：

```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a = 100, b = 0270, c = 0X2F;
    printf("a(d)=%d, d(#d)=%#d\n", a, a);
    printf("a(o)=%o, d(#o)=%#o\n", b, b);
    printf("c(x)=%x, c(#x)=%#x, c(X)=%X, c(#X)=%#X\n", c, c, c, c);

    system("pause");
    return 0;
}
```

运行结果：

```
a(d)=100, d(#d)=100
a(o)=270, d(#o)=0270
c(x)=2f, c(#x)=0x2f, c(X)=2F, c(#X)=0X2F
```
