当前位置: 首页 > article >正文

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 类型。

类型占用内存大小值范围存储形式内存示意图
char1 字节-128 ~ 127补码
signed char1 字节-128 ~ 127补码
unsigned char1 字节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 int2 字节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 int4 字节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;
}


http://www.kler.cn/a/292466.html

相关文章:

  • windows NGIMX配置WebSocket反向代理
  • 入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
  • 解决failed to execute PosixPath(‘dot‘) 或者GraphViz‘s executables not found
  • 【Visual Studio】使用VS调试(Debug)
  • MFC工控项目实例二十九主对话框调用子对话框设定参数值
  • 贪心算法day03(最长递增序列问题)
  • 使用 fetch() 函数和 Response 对象的示例,创建一个新的 Response 对象来模拟一个自定义响应
  • 深入解析 Node.js 核心模块与异步编程:高效构建现代服务器应用
  • 【TS高频面试题】interface与type的区别
  • 【原创】java+springboot+mysql企业产品销售管理系统设计与实现
  • 空间数据库
  • 新书分享|ChatGLM3大模型本地化部署、应用开发与微调(附PDF)
  • 打卡第五十七天:prim与kruskal算法
  • 人生苦短我用Python excel转csv
  • 麒麟安全加固工具,为系统打造坚固“金钟罩”!
  • 微软云技术深度解析与代码使用案例
  • Python 人脸识别实战教程
  • Qt:玩转QPainter后转之太极图(步骤详细、包含源码)
  • 软件开发专用术语介绍
  • HTML元素拓展:data-*属性的应用与实践
  • 国产芯片LT6911UXE/C:HDMI 2.0转MIPI DSI/CSI转换器,4K超清
  • 【数据结构-二维前缀和】【列维护优化】力扣3212. 统计 X 和 Y 频数相等的子矩阵数量
  • EmguCV学习笔记 VB.Net 9.2 VideoWriter类
  • 谷歌seo网址如何快速被收录?
  • 大模型笔记01--基于ollama和open-webui快速部署chatgpt
  • 13.5 Files类操作梳理(下)