C语言:基本数据类型 char, short int, int

目录

[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;
}
相关推荐
贾saisai29 分钟前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫34 分钟前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
2401_8582861135 分钟前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py37 分钟前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy37 分钟前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
jiao000012 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠2 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond2 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处3 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ4 小时前
Java 23 的12 个新特性!!
java·开发语言·学习