C语言:基本数据类型 char, short int, int
目录
1. char
1.1 使用 char 类型
1.2 存储形式
char (signed char) 有符号字符类型
unsigned char (无符号字符类型)
1.3 char 类型的取值范围在 头文件中的定义
1.4 char 类型与汇编
2. short int
2.1 使用 short int 类型
2.2 存储形式
short int (signed short int) 有符号短整型
unsigned short int (无符号短整型)
2.3 short int 类型的取值范围在 头文件中的定义
2.4 short int 类型与汇编
3. int
3.1 使用 int 类型
3.2 存储形式
int (signed int) 有符号整型
unsigned int (无符号整型)
3.3 取值范围在 头文件中的定义
3.4 int 类型与汇编
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 类型
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> 头文件中的定义
#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
#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 类型与汇编
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 类型
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> 头文件中的定义
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffff //65535 的十六进制表示
#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 类型与汇编
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 类型
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> 头文件中的定义
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
#define UINT_MAX 0xffffffff
#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 类型与汇编
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
#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;
}