c语言 --- 基本数据类型
常量
-
什么是常量:有不同的类型,固定的值,不能更改
-
常量的分类
-
整形常量
-
浮点常量
-
字符常量
-
字符串常量
-
常属性的变量(还是一个常量,不能修改)
-
整型常量
整数 -1,0,1,2,3,4 十进制整数 特殊格式的整数 01234 八进制整数:0开头 08 不算 0x1234 十六进制整数:0x开头 0b10111 二进制数:0b开头 2019以下的编译器不支持 特殊后缀的整数 1u 无符号整数:没有负数的整数类型 1L 长整形:占用的内存比较长
浮点常量
实数(包含整数、小数) 1.333 在编译器中小数默认是双精度(double)浮点型常量 双精度表示的小数位数>单精度 1.33f 单精度浮点型常量 占用的内存比双精度少 特殊的表示方式 科学计数法 1234E-5 1234*10的-5次方==0.01234 .E-4; 错误的写法:整数部分必须要有整数,指数部分必须要有指数
字符常量
转义字符:是具有特定含义字符,一般是由 \ 和特殊字符组成的具有特殊含义的字符
字符边界符 '' 'A' 一般情况只有一个字符 'AB'不算字符 转义字符 '\t' '\n'
字符串常量
-
字符串边界符 " "
-
字符串结束标记:每一个字符串都会存在看不见的结束符('\0');
变量
-
什么是变量,可以改变的量,C 语言中有不同类型的变量,一种类型的变量只能存储一种类型的数据(其实在C语言中充当数据容器的作用)
-
定义变量的语法:类型 标识符;
-
类型
-
标识符:就是一个名字、变量名、函数名
-
起名字:见名知意
-
标识符不能用数字当做开头,可以用 _、z 字母当做开头
-
标识符不能是 C 语言中的关键字(if,case,switch,int)
-
标识符大小写区分,大写和小写是不同的名字
-
-
起名字的方式
-
帕斯卡:大驼峰 PlayMusicByUser--->MFC中的函数一般采用大驼峰命名方式
-
驼峰:playMusicByUser--->一般使用这一种命名方式,首字母小写
-
匈牙利:特定前缀组成的命名方式,在帮助文档中做说明
-
g_ :全局变量 g_iNum;
-
c_:常量 c_iNum;
-
-
-
基本数据类型
-
基本的数据类型
-
int:整数类型
-
float:单精度浮点类型
-
double:双精度浮点类型
-
char:字符类型
-
-
修饰词
-
long(长)和short(短):体现数据占用内存(容量的大小)的基础上
-
-
-
short iNum = 0; short int sNum = 0; long lNum; long int liNum; 有修饰和没有修饰词是两种不同的数据类型 数据类型int可以省略 修饰词不能省略 什么时候用短的-> 要节省内存 占用的内存是原来的一半 什么时候用长的-> 数据超出了原来的表示范围用long
-
unsigned(无符号) 和 signed(有符号)
无符号:不能表示负数 一般默认的类型,表示的是有符号 年龄没有负数-->这种需求
-
const(常属性)
-
常属性的变量定义的时候必须初始化
-
常属性的变量不能被修改
-
小提示:一个程序不能大量出现常量的数 <-> 幻数
-
符号常量 <-> 宏定义的常量:用一个符号去替换一个常量
-
注意点
-
short 和 long 只能修饰整形
-
unsigned(无符号) 和 signed(有符号) 修饰整型和字符,不能修饰实数,实数本身包含正负数
-
-
auto/extern/static (后续再说)
/**********************************
* g_ : 全局
* c_ : 常量
* .....
***********************************/
#include <stdio.h>
int main()
{
1;
0123;
0x123;
0b101110;
1L;
1u;
1U;
1.444;
1234E-5;
'A'; //单个字符
"A"; //两个字符
//定义变量的语法
int iNum; //先定义变量后赋值
iNum = 1;
iNum = 2; //程序从上往下执行iNum = 2
float fNum;
double dNum;
char cNum = 'A'; //在定义变量时赋值
//赋值: =
long lNum = 1L;
short sNum = 1;
unsigned int uiNum = 1;
const int ciNum = 222;
//ciNum = 134; //错误 常属性的变量不能被修改
//short float sfNum = 0;
//short char scNum;
unsigned char c = 'A';
//unsigned float ufNum;
return 0;
}
进制与数据存储
-
了解各种进制
-
十进制:1 2 3 4 满10进 1
-
二进制:二进制表示3 0---0 1---1 10---2 11---3 满 2 进 1
-
十六进制 满16进 1
-
八进制:八进制表示8---10 满 8 进 1
-
十进制转其他进制都是用短除法
-
十进制转二进制:短除法
-
123的二进制:1111011
-
十进制转八进制:短除法
-
123的八进制:173
-
十进制转十六进制:短除法
-
123的十六进制:7b
-
十六进制中大于10的数表示方式不一样:11:a 12:b 13:c 14:d 15:e 16:f
-
转换的小知识 二进制转八进制 转十六进制
-
16---10000 8---1000 4---100 2---10 1---1
-
三个二进制位表示一个八进制位
-
四个二进制位表示一个十六进制位
-
-
其他进制转十进制 加权法
二进制与数据存储的关系
-
二进制与存储单位
-
存储的最小单位:一位,即一个二进制位
存储单位 | 表示含义 |
---|---|
bit:位 | 一个二进制位,能够表示的数字只有0和1 |
byte:字节 | 1B=8b,8个二进制位表示一个字节 |
KB:千字节 | 1KB=1024B =2^10 |
MB:兆字节 | 1MB=1024KB=2^10KB |
GB:吉字节 | 1GB=1024MB=2^10MB |
TB:太字节 | 1TB=1024GB=2^10GB |
数据的二进制存储
-
所有数据在计算机中都是用补码来存储的
-
补码:反码 + 1
-
反码:原码取反(但是符号位不变)
-
原码:负数:引入了符号位,用第一位表示正负,0表示正数,1表示负数
-
正数的二进制码 都是三码合一
-
整数在计算机中用32位表示
-
负数:1. 先求原码:原码引入了符号位,最高位为符号位,用1表示负数 2.求反码:原码取反,符号位不变 3.求补码:反码+1
-
补码转换为原码:补码 - 1->反码,反码取反->原码
正数:3:(三码合一) 原码:0000 0000 0000 0000 0000 0000 0000 0011 反码:0000 0000 0000 0000 0000 0000 0000 0011 补码:0000 0000 0000 0000 0000 0000 0000 0011 负数:-3 原码:1000 0000 0000 0000 0000 0000 0000 0011 //引入符号,最高位表示符号位 反码:1111 1111 1111 1111 1111 1111 1111 1100 //原码取反(但是符号位不变) 补码:1111 1111 1111 1111 1111 1111 1111 1101 //反码+1 //3-3 0000 0000 0000 0000 0000 0000 0000 0011 //两者相加 最高位不用管 已经抛到最外面了 1111 1111 1111 1111 1111 1111 1111 1101 0000 0000 0000 0000 0000 0000 0000 0000 //进位处理(寄存器有一个标志位处理) //注意点:补码要算出十进制数,必须先转换为原码,再去用加权法
-
C语言数据的范围
范围计算:以 char 类型为例
char:占用一个字节(8位) 1 <-> 0000 0000
考虑符号位,能够表示的最大值:0111 1111 == 1000 0000-1 == 2^7-1
1000 0000-1
0000 0000
2^7-1=128-1 =127
-2^7= -128
int:占用四个字节(32位) <-> -2^31-2^31-1
丘狸尾: 个人理解,为什么+1,为真可能不会改变检查范围,为假一定会消减一部分,所以**尽量让mid往假的那边靠**,防止死循环 也就是说,+1靠近假,就+,不+靠近假,就不加
丘狸尾: 二分法思想啊,什么跑另一个范围找
2301_80045399: 不过我感觉那个不用初始化,其实可以讲成本来是从一出发的,那么,只有dis1为0好,这个判断是否存在复环,所以是可以从任意一点出发,那么所有点的dis就都为0
2301_80045399: 一眼y总门徒
2301_80045399: 那个w要放在idx加加前面,Idx自增之后是准备引用做连接的空间