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;
}

  • 31
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值