C学习笔记——(2)数据类型的详细介绍

目录

  • 1、C语言中数据类型
  • 2、常量与变量
    • 2.1 常量
    • 2.2 变量
  • 3、整型:int
    • 3.1 整型变量的定义、输入和输出
      • (1)整型变量的定义:
      • (2)整型变量的输出:
      • (3)整型变量的输入:
    • 3.2 short、int、long、long long
  • 4、字符型:char
    • 4.1 字符变量的定义、输入和输出
    • 4.2、转义字符
  • 5、浮点型:float、double
  • 6、字符串格式化输出和输入
    • 6.1、字符串常量
    • 6.2、printf函数和putchar函数
        • (1)printf()
        • (2)putchar()
    • 6.3 scanf函数与getchar函数
      • (1)scanf()
      • (2)getchar()

数据类型的作用:编译器预算对象(变量)分配的内存空间大小。

1、C语言中数据类型

C学习笔记——(2)数据类型的详细介绍_第1张图片
C学习笔记——(2)数据类型的详细介绍_第2张图片

2、常量与变量

2.1 常量

常量:
 在程序运行过程中,其值不能被改变的量;
 常量一般出现在表达式或赋值语句中。

常量的定义方式有两种:
(1)宏定义:(推荐)

#define 常量名 值

(2)const关键字定义:(c中不安全,不推荐)

const 数据类型 常量名 =;

2.2 变量

变量:
 在程序运行过程中,其值可以改变;
 变量在使用前必须先定义,定义变量前必须有相应的数据类型。

定义格式:

数据类型 变量名 =;

注:在定义局部变量的时候,可以在数据类型的前面加auto,也可以不加。

3、整型:int

3.1 整型变量的定义、输入和输出

(1)整型变量的定义:

	int a = 123;	//定义变量a,以10进制方式赋值为123
	int b = 0567;	//定义变量b,以8进制方式赋值为0567,注意:八进制以0(零)开头
	int c = 0xabc;	//定义变量c,以16进制方式赋值为0xabc,注意:十六进制以0x开头(零)
	unsigned int d;  //定义无符号数
	signed int e;  //定义有符号数,这个等于 int e

(2)整型变量的输出:

打印格式(占位符) 含义
%d 输出一个有符号的10进制int类型
%o(字母o) 输出8进制的int类型
%x 输出16进制的int类型,字母以小写输出
%X 输出16进制的int类型,字母以大写输出
%u 输出一个10进制的无符号数

例子:

#include 

int main()
{
	int a = 123;	//定义变量a,以10进制方式赋值为123
	int b = 0567;	//定义变量b,以8进制方式赋值为0567
	int c = 0xabc;	//定义变量c,以16进制方式赋值为0xabc

	printf("a = %d\n", a);
	printf("8进制:b = %o\n", b);
	printf("10进制:b = %d\n", b);
	printf("16进制:c = %x\n", c);
	printf("16进制:c = %X\n", c);
	printf("10进制:c = %d\n", c);

	unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
	printf("有符号方式打印:d = %d\n", d);
	printf("无符号方式打印:d = %u\n", d);
	return 0;
}

结果:
C学习笔记——(2)数据类型的详细介绍_第3张图片

(3)整型变量的输入:

输入就是下面这样很简单,但是在visual studio中运行不过去,解决办法贴在下面:

int a;
scanf("%d", &a);

scanf安全问题解决,复制下面的任意一条:

#define _CRT_SECURE_NO_WARNINGS   // 必须在首行

pragma warning(disable:4996)  // 不必在首行

3.2 short、int、long、long long

下面看看整型的类型:

数据类型 占用空间
short(短整型) 2字节
int(整型) 4字节
long(长整形) Windows为4字节,Linux为4字节(32位),8字节(64位)
long long(长长整形) 8字节

注意

  • 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。
  • 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
整型常量 所需类型
10 代表int类型
10l, 10L 代表long类型
10ll, 10LL 代表long long类型
10u, 10U 代表unsigned int类型
10ul, 10UL 代表unsigned long类型
10ull, 10ULL 代表unsigned long long类型
打印格式 含义
%hd 输出short类型
%d 输出int类型
%ld 输出long类型
%lld 输出long long类型
%hu 输出unsigned short类型
%u 输出unsigned int类型
%lu 输出unsigned long类型
%llu 输出unsigned long long类型

下面看一下,这几种类型在计算机中占的字节数,我们用sizeof()关键字获取:

  • sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
  • sizeof的返回值为size_t
  • size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
#include 

int main(void) {
	short a = 10;
	int b = 10;
	long c = 10l; //或者10L
	long long d = 10ll; //或者10LL

	// sizeof()计算数据类型在内存中占的字节(byte)大小,得到的结果是:无符号int类型
	//格式为:sizeof(数据类型) or sizeof(变量名) or sizeof 变量名
	printf("%d\n", sizeof(a)); //2
	printf("%d\n", sizeof(b)); //4
	printf("%d\n", sizeof(c)); //4
	printf("%d\n", sizeof(d)); //8

	// 下面是无符号数的表示
	unsigned short a2 = 20u;
	unsigned int b2 = 20u;
	unsigned long c2 = 20ul;
	unsigned long long d2 = 20ull;
	
	printf("unsigned short a = %hu\n", a2);
	printf("unsigned int b = %u\n", b2);
	printf("unsigned long c = %lu\n", c2);
	printf("unsigned long long d = %llu\n", d2);

	return 0;
}

结果:
C学习笔记——(2)数据类型的详细介绍_第4张图片

4、字符型:char

4.1 字符变量的定义、输入和输出

字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。

字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。

看一个例子:

#define _CRT_SECURE_NO_WARNINGS  //VS中使用的
#include 

int main() 
{
	char a;
	scanf("%c", &a);  //键盘输入一个字符,占位符为%c
	printf("%c\n", a);  //打印出这个字符,占位符为%c

	printf("%d\n", a);  //打印出这个字符对应的ASCII码
	printf("%d\n", sizeof(a));  //打印这个字符在内存中占用的字节数

	return 0;
}

结果:(假如输入d)
在这里插入图片描述

所以要是忘记了一个字符的ASCII码,不查表的情况下,使用下面的语句也可以知道:

	printf("%d\n", a);  //打印出这个字符对应的ASCII码

4.2、转义字符

转义字符 含义 ASCII码值(十进制)
\a 警报 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜线字符"" 092
\’ 代表一个单引号(撇号)字符 039
\" 代表一个双引号字符 034
\? 代表一个问号 063
\0 数字0 000
\ddd 8进制转义字符,d范围0~7 3位8进制
\xhh 16进制转义字符,h范围0~9,a-f,A-F 3位16进制

注意:加粗字体标注的为不可打印字符。

这里还有个字符,就是"%"怎么打印,%%这样就可以打印出一个%号了。

5、浮点型:float、double

实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。
由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

我们查看一下float、double类型占用的字符:

#include 

int main() {
	float a = 9.0;
	double b = 2.0;
	printf("%d\n", sizeof(a));  //4
	printf("%d\n", sizeof(b));  //8

	return 0;
}

运行结果:
在这里插入图片描述

然后我们看一下整型变量和浮点型变量在内存中保存的位置:
其中:%p是一个占位符,表示输出一个变量对应的内存地址编号(无符号十六进制整型数)

int main() {
	int a = 10;
	float b = 2.0;
	// %p是一个占位符,表示输出一个变量对应的内存地址编号(无符号十六进制整型数)
	printf("%p\n", &a);
	printf("%p\n", &b);

	return 0;
}

运行结果:
在这里插入图片描述

科学计数法怎么表示呢?看下面:

int main() {
	float a = 2e-3;  //e后面是负数,表示乘0.1的次方
	float b = 2e3;  //e后面是正数,表示乘10的次方
	printf("%f\n", a);
	printf("%f\n", b);
	printf("%e\n", 33242.656);  //%e占位符,将这个数用科学计数法表示

	return 0;
}

运行结果:
在这里插入图片描述

6、字符串格式化输出和输入

6.1、字符串常量

  • 字符串是内存中一段连续的char空间,以’\0’(数字0)结尾。
  • 字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。

字符串常量与字符常量的不同:
C学习笔记——(2)数据类型的详细介绍_第5张图片
每个字符串的结尾,编译器会自动的添加一个结束标志位’\0’,即 “a” 包含两个字符’a’和’\0’。

6.2、printf函数和putchar函数

printf是输出一个字符串,putchar输出一个char。

(1)printf()

下面对printf的输出格式做一个总结:

打印格式 对应数据类型 含义
%d int 接受整数值并将它表示为有符号的十进制整数
%hd short int 短整数
%hu unsigned short 无符号短整数
%o unsigned int 无符号8进制整数
%u unsigned int 无符号10进制整数
%x,%X unsigned int 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF
%f float 单精度浮点数
%lf double 双精度浮点数
%e,%E double 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写
%c char 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
%s char * 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符)
%p void * 以16进制形式输出指针
%% % 输出一个百分号

printf的附加格式:

字符 含义
l(这是字母l) 附加在d,u,x,o前面,表示长整数
-(这个是减号) 左对齐
m(代表一个整数) 数据最小宽度
0(数字0) 将输出的前面补上0直到占满指定列宽为止不可以搭配使用-
m.n(代表一个整数) m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。

看一下这个附加格式的例子:

#include 

int main() {
	float a = 3.1415926;
	printf("===%-12.3f===", a);
	return 0;
}

结果:
在这里插入图片描述

(2)putchar()

这个函数就是输出一个字符,里面的参数是一个ASCII码值,所以要是输入字符,其实就会自动转成ASCII码值。

例子:

int main() {
	char ch = 'd';
	putchar(ch);  //输出变量,结果:d
	putchar('a'); //输出字符,结果:a
	putchar(97);  //输出数字(0-127才能显示),结果:a
	putchar('\n'); //输出转义字符,结果:换行

	return 0;
}

6.3 scanf函数与getchar函数

  • getchar是从标准输入设备读取一个char。
  • scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。

(1)scanf()

scanf()函数输入多个时,默认是使用空格或者换行为结束的,所以要是在这多个输入之间用别的符号(如逗号)作为分割,那就要在转义符%后面加这个符号,看具体例子吧:

#define  _CRT_SECURE_NO_WARNINGS  //VS避错
#include 

int main() {
	int a, b, c, d;  // 定义四个整型

	printf("接下来这个输入默认用空格或者换行作为结束:\n");
	scanf("%d%d", &a, &b);  // 这个输入默认用空格或者换行作为结束
	printf("%d,%d\n", a, b);

	printf("下面这个输入改用逗号作为结束:\n");
	scanf("%d,%d", &c, &d);
	printf("%d,%d\n", c, d);

	return 0;
}

运行结果:
C学习笔记——(2)数据类型的详细介绍_第6张图片

(2)getchar()

getchar是从标准输入设备读取一个char,注意:只能读取一个字符。

例子:

int main() {
	char ch;
	ch = getchar();  //接收键盘获取字符
	putchar(ch);  //输入这个字符
	return 0;
}

你可能感兴趣的:(C学习笔记)