目录
[1. char](#1. char)
[1.1 使用 char 类型](#1.1 使用 char 类型)
[1.2 存储形式](#1.2 存储形式)
[char (signed char) 有符号字符类型](#char (signed char) 有符号字符类型)
[unsigned char (无符号字符类型)](#unsigned char (无符号字符类型))
[1.3 char 类型的取值范围在 头文件中的定义](#1.3 char 类型的取值范围在 头文件中的定义)
[1.4 char 类型与汇编](#1.4 char 类型与汇编)
[2. short int](#2. short int)
[2.1 使用 short int 类型](#2.1 使用 short int 类型)
[2.2 存储形式](#2.2 存储形式)
[short int (signed short int) 有符号短整型](#short int (signed short int) 有符号短整型)
[unsigned short int (无符号短整型)](#unsigned short int (无符号短整型))
[2.3 short int 类型的取值范围在 头文件中的定义](#2.3 short int 类型的取值范围在 头文件中的定义)
[2.4 short int 类型与汇编](#2.4 short int 类型与汇编)
[3. int](#3. int)
[3.1 使用 int 类型](#3.1 使用 int 类型)
[3.2 存储形式](#3.2 存储形式)
[int (signed int) 有符号整型](#int (signed int) 有符号整型)
[unsigned int (无符号整型)](#unsigned int (无符号整型))
[3.3 取值范围在 头文件中的定义](#3.3 取值范围在 头文件中的定义)
[3.4 int 类型与汇编](#3.4 int 类型与汇编)
[4. 整数常量在 C 语言的书写格式](#4. 整数常量在 C 语言的书写格式)
C语言中,不同的数据类型用于声明变量,决定了变量在内存中占多少的内存空间。
1. char
char 类型,主要用于存储字符的 ASCII码,占用内存大小为 1 个字节。char 类型又分为有符号 signed char 类型和 无符号 unsigned char 类型,如果不在 char 前面加上符号说明,默认是有符号 signed char 类型。
|---------------|--------|-------------|------|----------------------------------------------------------------------------|
| 类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
| char | 1 字节 | -128 ~ 127 | 补码 | |
| signed char | 1 字节 | -128 ~ 127 | 补码 | |
| unsigned char | 1 字节 | 0 ~ 255 | 二进制 | |
1.1 使用 char 类型
cpp
char c1 = 48; // 定义一个 char 类型变量 c1,并初始化为 48
char c2 = '1'; // 定义一个 char 类型变量 c2,并初始化为 '1'
signed char c3 = 65; // 定义一个 signed char 类型变量 c3,并初始化为 65
signed char c4 = 'a'; // 定义一个 signed char 类型变量 c4,并初始化为 'a'
unsigned char c5 = 90; // 定义一个 unsigned char 类型变量 c5,并初始化为 90
unsigned char c6 = 'z'; // 定义一个 unsigned char 类型变量 c6,并初始化为 'z'
1.2 存储形式
char (signed char) 有符号字符类型
char (signed char) 类型,在内存中以二进制补码的形式存储,正数的补码 = 原码,负数的补码 = 反码 + 1。比如:
- char c0 = 'a'; // 'a' 的ASCII码 97,补码为: 0x61
- char c1 = -128; // 补码为: 0x80
unsigned char (无符号字符类型)
unsigned char 类型,在内存中直接用它的二进制形式存储,比如:
- unsigned char c = 255,在内存中存储的值 c = 0xff。
1.3 char 类型的取值范围在 <limits.h> 头文件中的定义
cpp
#define CHAR_BIT 8 // char 占用 8 位
#define SCHAR_MIN (-128) // 有符号 char 最小值
#define SCHAR_MAX 127 // 有符号 char 最大值
#define UCHAR_MAX 0xff // 无符号 char 最大值
#ifndef _CHAR_UNSIGNED // 如果没有定义 char 是无符号类型
#define CHAR_MIN SCHAR_MIN // char 的最小值 = 有符号 char 的最小值
#define CHAR_MAX SCHAR_MAX // char 的最大值 = 有符号 char 的最大值
#else // 如果定义了 char 是无符号类型
#define CHAR_MIN 0 // char 的最小值 = 0
#define CHAR_MAX UCHAR_MAX // char 的最大值 = 无符号 char 的最大值
#endif
cpp
#include <stdio.h>
#include <limits.h>
int main() {
printf("char size = %d\n", sizeof(char)); // char size = 1
printf("signed char size = %d\n", sizeof(signed char)); // signed char size = 1
printf("SCHAR_MIN = %d\n", SCHAR_MIN); // SCHAR_MIN = -128
printf("SCHAR_MAX = %d\n", SCHAR_MAX); // SCHAR_MAX = 127
printf("unsigned char size = %d\n", sizeof(unsigned char)); // unsigned char size = 1
printf("UCHAR_MAX = %u\n", UCHAR_MAX); // UCHAR_MAX = 255
return 0;
}
1.4 char 类型与汇编
cpp
char c1 = 48; // 定义一个 char 类型变量 c1,并初始化为 48
mov byte ptr [ebp-5],30h ;ebp-5 这个字节单元存放 30h (48)
char c2 = '1'; // 定义一个 char 类型变量 c2,并初始化为 '1'
mov byte ptr [ebp-11h],31h ;ebp-11h 这个字节单元存放 31h (49)
signed char c3 = 65; // 定义一个 signed char 类型变量 c3,并初始化为 65
mov byte ptr [ebp-1Dh],41h ;ebp-1Dh 这个字节单元存放 41h (65)
signed char c4 = 'a'; // 定义一个 signed char 类型变量 c4,并初始化为 'a'
mov byte ptr [ebp-29h],61h ;ebp-29h 这个字节单元存放 61h (97)
unsigned char c5 = 90; // 定义一个 unsigned char 类型变量 c5,并初始化为 90
mov byte ptr [ebp-35h],5Ah ;ebp-35h 这个字节单元存放 5Ah (90)
unsigned char c6 = 'z'; // 定义一个 unsigned char 类型变量 c6,并初始化为 'z'
mov byte ptr [ebp-41h],7Ah ;ebp-41h 这个字节单元存放 7Ah (122)
2. short int
short int 类型,占用内存大小为 2 个字节。short int 类型又分为有符号 signed short int 类型和 无符号 unsigned short int 类型,如果不在 short int 前面加上符号说明,默认是有符号 signed short int 类型。
|------------------------------|--------|-----------------------|------|----------------------------------------------------------------------------|
| 类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
| short int (signed short int) | 2 字节 | -(2^15) ~ (2^15)-1 | 补码 | |
| unsigned int | 2 字节 | 0 ~ (2^16)-1 | 二进制 | |
2.1 使用 short int 类型
cpp
short int si1 = -1; // 定义一个 short int 类型变量 si1,并初始化为 -1
signed short int si2 = 1; // 定义一个 signed short int 类型变量 si2,并初始化为 1
unsigned short int usi1 = 65535; // 定义一个 unsigned short int 类型变量 usi1,并初始化为 65535
2.2 存储形式
short int (signed short int) 有符号短整型
short int (signed short int) 类型,在内存中以二进制补码的形式存储,正数的补码 = 原码,负数的补码 = 反码 + 1。比如:
- short int si1 = -1; // 补码为:0xffff
- signed short int si2 = 1; // 补码为:0x0001
unsigned short int (无符号短整型)
unsigned short int类型,在内存中直接用它的二进制形式存储,比如:
- unsigned short int usi1 = 65535,在内存中 c = 0xffff。
2.3 short int 类型的取值范围在 <limits.h> 头文件中的定义
cpp
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffff //65535 的十六进制表示
cpp
#include <stdio.h>
#include <limits.h>
int main() {
printf("short int size = %d\n", sizeof(short int)); // short int size = 2
printf("signed short int size = %d\n", sizeof(signed short int)); // signed short int size = 2
printf("SHRT_MIN = %d\n", SHRT_MIN); // SHRT_MIN = -32768
printf("SHRT_MAX = %d\n", SHRT_MAX); // SHRT_MAX = 32767
printf("unsigned short int size = %d\n", sizeof(unsigned short int)); // unsigned short int size = 2
printf("USHRT_MAX = %u\n", USHRT_MAX); // USHRT_MAX = 65535
return 0;
}
2.4 short int 类型与汇编
cpp
short int si1 = -1; // 定义一个 short int 类型变量 si1,并初始化为 -1
or eax,0FFFFFFFFh ;相当于 mov eax,0FFFFFFFFh, 但 or eax, 0FFFFFFFFh 更高效
mov word ptr [ebp-8],ax ;eax的低16位 ax 的值传送到 ebp-8 这个字单元中
signed short int si2 = 1; // 定义一个 signed short int 类型变量 si2,并初始化为 1
mov eax,1
mov word ptr [ebp-14h],ax ;eax的低16位 ax 的值传送到 ebp-14h 这个字单元中
unsigned short int usi1 = 65535; // 定义一个 unsigned short int 类型变量 usi1,并初始化为 65535
mov eax,0FFFFh
mov word ptr [ebp-20h],ax ;eax的低16位 ax 的值传送到 ebp-20h 这个字单元中
3. int
int 类型,占用内存大小为 4 个字节。int 类型又分为有符号 signed int 类型和 无符号 unsigned int 类型,如果不在 int 前面加上符号说明,默认是有符号 signed int 类型。
|------------------|--------|-----------------------|------|----------------------------------------------------------------------------|
| 类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
| int (signed int) | 4 字节 | -(2^31) ~ (2^31)-1 | 补码 | |
| unsigned int | 4 字节 | 0 ~ (2^32)-1 | 二进制 | |
3.1 使用 int 类型
cpp
int i1 = -1; // 定义一个 int 类型变量 i1,并初始化为 -1
signed int i2 = 1; // 定义一个 signed int 类型变量 i2,并初始化为 1
unsigned int ui1 = 0xffffffff; // 定义一个 unsigned int 类型变量 ui1,并初始化为 0xffffffff
3.2 存储形式
int (signed int) 有符号整型
int (signed int) 类型,在内存中以二进制补码的形式存储,正数补码 = 原码,负数补码 = 反码 + 1。比如:
- int i1 = -1; // 补码为: 0xffffffff
- signed int i2 = 1; // 补码为: 0x00000001
unsigned int (无符号整型)
unsigned int类型,在内存中直接用它的二进制形式存储,比如:
- unsigned int ui1 = 0xffffffff,在内存中 c = 0xffffffff。
3.3 取值范围在 <limits.h> 头文件中的定义
cpp
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
#define UINT_MAX 0xffffffff
cpp
#include <stdio.h>
#include <limits.h>
int main() {
printf("int size = %d\n", sizeof(int)); // int size = 4
printf("signed int size = %d\n", sizeof(signed int)); // signed int size = 4
printf("INT_MIN = %d\n", INT_MIN); // INT_MIN = -2147483648
printf("INT_MAX = %d\n", INT_MAX); // INT_MAX = 2147483647
printf("unsigned int size = %d\n", sizeof(unsigned int)); // unsigned int size = 4
printf("UINT_MAX = %u\n", UINT_MAX); // UINT_MAX = 4294967295
return 0;
}
3.4 int 类型与汇编
cpp
int i1 = -1; // 定义一个 int 类型变量 i1,并初始化为 -1
mov dword ptr [ebp-8],0FFFFFFFFh ;-1的补码是:0FFFFFFFFh,存在 ebp-8 为首地址的4个字节单元中
signed int i2 = 1; // 定义一个 signed int 类型变量 i2,并初始化为 1
mov dword ptr [ebp-14h],1 ;数据 1,存在 ebp-14h 为首地址的4个字节单元中
unsigned int ui1 = 0xffffffff; // 定义一个 unsigned int 类型变量 ui1,并初始化为 0xffffffff
mov dword ptr [ebp-20h],0FFFFFFFFh ;数据 0FFFFFFFFh,存在 ebp-20h 为首地址的4个字节单元中
4. 整数常量在 C 语言的书写格式
在计算机科学中,一般可以用二进制,八进制,十进制,十六进制来表示一个同一个数据,所以在 C 语言中,对于一个整型常量,也有4种书写格式。比如,一个 short int 类型数字 12
- 默认为十进制书写方式:12
- 以数字0开头为八进制书写方式:014
- 以0b开头为二进制书写方式:0b0000000000001100
- 以0x开头为十六进制书写方式:0x000C
cpp
#include <stdio.h>
int main() {
// 以下为初始化为相同值:12
char c1 = 12;
char c2 = 014;
char c3 = 0b00001100;
char c4 = 0x0c;
printf("%d, %d, %d, %d\n", c1, c2, c3, c4);
// 以下为初始化为相同值:12
short int si1 = 12;
short int si2 = 014;
short int si3 = 0b0000000000001100;
short int si4 = 0x000c;
printf("%d, %d, %d, %d\n", si1, si2, si3, si4);
// 以下为初始化为相同值:12
int i1 = 12;
int i2 = 014;
int i3 = 0b00001100;
int i4 = 0x0c;
printf("%d, %d, %d, %d\n", i1, i2, i3, i4);
return 0;
}