c语言中数据类型
2.1.1关键字
C的关键字共有32个
-
数据类型关键字(12个)
char short int long float double
unsigned signed struck union enum void -
控制语句关键字(12个)
if else switch case default for
do while break continue goto return -
存储类型关键字(5个)
auto extren register static const -
其他关键字(3个)
sizeof typedef volatile
2.1.2数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小
基本类型: 整形(int, short,long),
字符型(char),
实形/浮点型(float,double)
数据类型: 构造类型:数据类型,
结构类型(struct),
联合类型(union),
枚举类型(enum)
指针类型:(char *,int *,int **等)
2.1.3常量
- 常量
- 在程序运行过程中,其值不能被改变的量
- 常量一般出现在表达式或赋值语句中
- 整形常量:100,200,-100,0
- 实形常量:3.14,0.125,-3.66456
- 字符型常量:'a','b','c','d','e'
- 字符串常量:"Hello Word","老龙很帅"
2.1.4变量
- 变量
- 在程序运行过程中,其值可以被改变
- 变量在使用前必须先定义,定义变量必须有相应的数据类型
- 标识符命名规则:
- 标识符不能是关键字
- 标识符只能由字母,数字,下划线组成
- 第一个字符必须为字母或者下划线
- 标识符中字母区分大小写
- 变量的特点
- 变量在编译时为其分配相应的内存空间
- 可以通过其名字和地址访问相应内存
- 声明和定义的区别
- 声明变量不需要建立存储空间.如:extern int a;
- 定义变量需要建立存储空间,如:int b;
#include<stdio.h>
int main(){
//extern关键字只做声明,不能做人和定义,后面还会学,这里先了解
//声明一个变量a,a在这里没有建立存储空间
extern int a;
a=10;//没有空间,不可赋值
//每一行代码以英文的:分号(;)结束
int b=10;.//定义一个变量b,b的类型int,b赋值为10
//定义变量的时候给他赋值叫做初始化变量
int c; //定义变量
return 0;
}
从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义
- int b它即是声明,同时又是定义
- 对于extern int b来讲它只是声明不是定义
一般情况下,把建立存储空间的声明称之为'定义',而把不需要建立存储空间的声明称之为'声明'.
2.1.5使用示例
#include<stdio.h>
#define MAX 100
/*
1.#开头的语句是预处理语句,无需分号结束
2.定义一个宏定义标识符MAX,它代表100,MAX它是常量
3.宏定义以后的代码都可以使用MAX
4.在后面出现的MAX,预处理都会替换为100
*/
int main(){
MAX;
MAX;
//const 是一个关键字,作用是修饰一个变量只读
const int b=10086;
return 0;
}
2.2进制
二进制,八进制,十进制,十六进制
` 进制也就是进位制,是人们规定的一种进位方法,对于任何一种进制---X进制,就表示某一位置上位置上的数运算时逢X进一位,十进制逢十进一,十六进制是逢十六进一,二进制是逢二进一,以此类推,X进制就是逢X进一.
十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 a
11 1011 13 b
- 二进制,位,字节与字
我们习惯于十进制的数: 10,12等
一个位只能表示0,或者1两种状态,简称bit,一个位是一个bit
一个字节位8个二进制,称为8位,简称BYTE,8个bit是一个字节
一个字(汉字)为2个字节,简称WORD
两个字为双字,简称DWORD
-
八进制
八进制以8为基础的进制系统,c语言当中用0表示八进制,比如:0666 -
十六进制
十六进制以16为基础的进制系统,c语言当中用0x表示十六进制
//进制的输出方式
#include <stdio.h>
int main(){
int a=10;//什么都不默写是十进制数据
int b=010;//数字前面加个0表示八进制数据
int c=0x10;//数字前面加个0x表示十六进制数据
printf("%d\n",a);//%d表示按照十进制数据输出显示
printf("%o\n",b);//%o表示按照八进制数据输出显示
printf("%x\n",c);//%x表示按照十六进制数据输出显示
return 0;
}
2.3计算机内存数值存储方式
原码
将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身绝对值
+7的原码是0000 0111
-7的原码是1000 0111
+0的原码是0000 0000
-0的原码是1000 0000
反码
- 一个数如果为正,那么反码和原码相同
- 一个数如果为负,那么符号位为1,其他各位与原码相反
+7的反码0000 0111
-7的反码1111 1000
+0的反码0000 0000
-0的反码1111 1111
补码
原码和反码都不利于计算机运算,如:原码表示的7和-7相加,还需要判断符号位
整数:原码,反码,补码都相同
负数:最高位为1,其余各位原码取反,最后对整个数+1
-7的补码:=
1000 0111(原码)
1111 1000(反码)
1111 1001(补码)
+0的补码为:0000 0000
-0的补码为:
1000 0000(原码)
1111 1111(反码)
10000 0000(补码)
补码符号位不动,其他位求反,最后整个数+1,得到原码
用补码进行运算,减法可以通过加法实现
7-6=1
7的补码和-6的补码相加:0000 0111+1111 1010=1000 0001
进位舍弃后,剩下的0000 0001就是1的补码.
7: -6:
0000 0111(原码) 1000 0110(原码)
0000 0111(反码) 1111 1001(反码)
0000 0111(补码) 1111 1010(补码)
0000 0111 (7的补码)
1111 1010 (-6的补码)
10000 0001 (1)
-7+6=-1
-7的补码和-6的补码相加:0000 0111+1111 1010=1111 1111
-7: 6:
0000 0111 (原码) 1000 0110(原码)
0000 0111 (反码) 1111 1001(反码)
0000 0111 (补码) 1111 1010(补码)
2.4 sizeof关键字
sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节
计量单位都有什么???
计算机中的最小单位???
位 (bit)
计算机中的最小的存储单位是什么???
字节 (Byte)
int类型
-
int常量,变量
int就是32位的一个二进制整数,在内存当中占据4个字节空间printf输出int值
%d,输出一个有符号的10进制整数,
%u,代表输出一个无符号的10进制整数 -
printf输出八进制和十六进制
%x, 代表输出16进制数,
%X, 用大写字母方式输出16进制数
%o,代表输出八进制数 -
short, long, long long, unsigned int
short意思为短整数, 在32位系统下是2个字节, 16个比特
long意思为长整数, 在32位的系统下, long都是4个字节的, 在64位系统下,windows还是4个字节, unix下成了8个字节
int不管是32位系统下, 还是64位系统下, 不论是windows还是unix都是4个字节的
数据溢出
计算一个整数的时候超过整数能够容纳的最大单位后, 整数会溢出, 溢出的结果是高位舍弃
当一个小的整数赋值给大的整数, 符号位不会丢失,会继承
大端对齐与小端对齐
对于arm,intel这种x86构架的复杂指令CPU,整数在内存中是倒着存放的,低地址放低位,高地址放高位,小端对齐
但对于unix服务器的CPU,更多是采用大端对齐的方式存放整数
char类型
1.char常量,变量
char c; 定义一个char变量
'a'char的常量
char的本质就是一个整数, 一个只有1个字节大小的整数
2.printf输出char
%c意思是输出一个字符,而不是一个整数
3.不可打印char转义符
\a,警报
\b退格
\n换行
\r回车
\t制表符
\ \斜杠
\ '单引号
\ "双引号
?问号
4.char和unsigned char
char取值范围为-128到127
unsigned char为0-255
浮点float,double类型
1.浮点常量, 变量
float在32位系统下是4个字节, double在32位系统下是8个字节
小数的效率很低, 避免使用, 除非明确的要计算一个小数
2.printf输出浮点数
%f,%lf
%f是输出一个float
%lf输出一个double
3.类型限定
- const
- const是代表一个不能改变值的常量
- volatile
- 代表变量是一个可能被CPU指令之外的地方改变的, 编译器就不会针对这个变量去优化目标代码
- register
- 变量在CPU寄存器里面, 而不是在内存里面. 但regist是建议型的指令, 而不是命令型的指令
字符串格式化输出与输入
-
字符串在计算机内部的存储方式
字符串是内存中一段连续的char空间,以'\0'结尾
""(双引号)是c语言表达字符串的方式 -
printf函数,putchar函数
printf格式字符
字符 对应数据类型 含义 d int 接受整数值并将它表示为有符号的十进制整数 hd short int 短整数 hu unsigned short int 无符号短整数 o unsigned int 无符号8进制整数 u unsigned int 无符号10进制整数 x/X unsigned int 无符号16进制整数 x对应小写,X对应大写 f/lf float或double 单精度浮点数或双精度浮点数 e/E double 科学计数法表示的数,'e'的大小写表示输入时的大小写 c char 字符型,按照ASCII码转换成对应字符 s/S char* / wchar_t * 字符串,输出字符串中的字符直到空字符('\0') p void* 以16进制形式输出指针 % % 输出一个百分号(%) //printf的附加格式 字符 含义 l 附加在d,u,x,o前面,表示长整数 - 左对齐 m 数据的最小宽度 0 将输出的前面补上0,直到占满指定列宽为止(不可以搭配'-'使用) N 宽度至少N位,不够以空格填充 putchar是显示一个字符的函数
-
scanf函数与getchar函数
scanf通过键盘读取用户输入,放入变量中,记得参数一定是变量的地址(&)
int a=0;
int b=0;
scanf("%d",&a);//一定要用&取变量的地址
scanf("%d",&b);//一定要用&取变量的地址
getchar得到用户键盘输入的字符
浙公网安备 33010602011771号