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得到用户键盘输入的字符

posted @ 2020-09-23 19:00  宋子钰  阅读(696)  评论(0)    收藏  举报