数据类型
Day1
0、
计算机只是一个工具,计算的工具,通过计算来帮我们解决问题
计算机保存问题中数据?
先保存问题的抽象数据,然后再对抽象数据进行某一种运算
运算后就能得到一个结果,数据应该怎么去保存?
数据有什么属性:
大小
整数/小数
....
这些属性我们就是通过数据类型来体现。
1、C语言的数据类型
有四大数据类型:
(1)基本数据类型
C语言已经帮我们定义好了,我们就能直接拿过来使用
整型数据:用来保存整数
short [int] //短整型
int //整型
long [int] //长整型
long long [int] //长长整型
为什么非要分这么多类?
表示的数据大小范围不一样
1字节 = 8bit
short “一般”来讲 占2字节
int “一般”来讲 占4字节
long “一般”来讲 占4字节
long long “一般”来讲 占8字节
“一般” 是指不一定就是这么多,和所用使用的机器有关
“一般” 是指32位机器下
如果记不住怎么办?
提供了一个关键字 ---> sizeof 求一个对象的所占字节数
unsigned / signed
表示 无符号 / 有符号(默认有符号)
0 1 代表高低电平
无符号:所有的bit位都是数据位
有符号:最高bit位代表是符号,其余位是数据位
0代表是正数,1代表的是负数
unsigned short 无符号短整型
(signed) short 有符号短整型
unsigned int 无符号整型
(signed) int 有符号整型
unsigned long 无符号长整型
(signed) long 有符号长整型
unsigned long long 无符号长长整型
(signed) long long 有符号长长整型
字符型:用来保存字符的
char: 在任何机器上面都是1字节,8bit
unsigned char / signed char
浮点型(实型):用来保存小数
单精度浮点型:
float 占4字节
双精度浮点型:
double 占8字节
long double 占16字节(64位)
格式说明 由“%” + 格式符号
d --> 整型
ld --> 长整型
o --> 8进制
u --> 无符号整型
c --> 字符(单)
s --> 字符串
f --> 实数
(2)构造类型: 需要我们自己去定义
数组:
数据类型 数组名[数组元素个数]
结构体
共用体
枚举
(3)指针类型
(4)空类型 void
void 在C语言有三个地方会用
1、void func()
{
}
作为函数的返回值
2、int main(void)
{
}
作为函数参数,代表函数不需要参数,可省略
3、void *
通用指针类型
C语言中 数据 按照是否可以被修改(是否可写)分为两种:
不可修改: 常量
可被修改: 变量
2、常量
在程序在运行的过程中,不可以改变它的值。
常量也分为多类:
(1)整型的常量
在代码中的一个体现 由一串数字组成(整数)
以0开头的,默认就是八进制: 0[0-7][0-7].....
0123
0145
0789 //不是一个8进制
以0x/0X开头的,默认位十六进制:0x[0-9a-f][0-9a-f]...
0xa
0xf
0x12
...
其他的就是十进制
123 没有后缀,默认int
123l 有后缀l,就是long
为什么没有二进制?
二进制写起来太长了,其次就是转换起来简单
0 1 2 3
01 010 011
01 111 111 101
01 7 7 5
0x 1 2 3
0001 0010 0011
0110 1100 1101 1111
转换成 八进制、十进制、十六进制
八进制:066337
十进制:6 * 8^4 + 6 * 8^3 + 3 * 8^2 + 3 * 8 + 7 = 27871
十六进制:0x6cdf
(2)字符常量:
在C语言中用''引起来的一个或者多个字符序列
如 'a'、'3'
在计算机中保存的时候,不是字面上形状的保存
而是保存了对应字符的 ascii 码
ascii 码:把一个字符对应一个数字,该数字我们称为该字符的ascii码
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
010 8 08 BS '\b' (backspace) 110 72 48 H
011 9 09 HT '\t' (horizontal tab) 111 73 49 I
012 10 0A LF '\n' (new line) 112 74 4A J
101 65 41 A
141 97 61 a
060 48 30 0
字符:分为两种
普通字符:在打印的时候是可以显示形状的字符
printf("%c\n",'A');
转义字符:打印的时候没有形状,但是有特殊的含义
'\t' --> 制表符(tab)
'\n' --> 换行
'\0' --> 字符串结束符,空字符
'\***':由'\'后面接一个、两个或者三个八进制数组成
这些八进制的数字用来指定一个所期望的字符
'\107' --> 'G'
'\x**':由'\x'后面接一个或者两个十六进制数组成
这些十六进制的数字用来指定一个所期望的字符
'\x41' --> 'A'
(3)浮点常量
后缀可以是 f/F l/L
f/F --> float
l/L --> long double
如果没有后缀,默认它是double
C语言中小数默认都是double
1.23f --> float
1.23 --> double
0.12 .12 整数部分为0可以省略
12.0 12. 小数部分为0可以省略
科学计数法:
由整数部分,小数点,小数部分,一个e/E,一个可选带符号的整型
1234.5678 --> 1.2345678 * 10^3 --> 1.2345678e3
0.001234 --> 1.234 * 10^-3 --> 1.234E-3
(4)枚举常量(后面解释)
(5)符号常量
#define N 3.14
如果使用N,自动替换成 3.14
为了修改方便,并且不会改变其他的实际需要用的数值
Day2
一、变量
定义:在程序运行期间,它的值可以被改变,被修改。
变量会对应一个可写可读的内存单元。
内存单元由变量的类型来决定。
定义格式:
数据类型 变量名(=变量的初始值)
Int b=5;定义时才叫初始化。
二、c语言标识符
定义:只能由数字,字母,下划线组成,不能由数字开头
不支持如%,*,& 不能使用c语言内部标识符
三、变量属性
1.数据类型:任意C语言的数据类型
2.变量名:必须符合C语言标识符的规定,且不能是C语言的关键字
3.变量内存单元:用来保存变量数据的存储空间,这个存储空间会有一个地址(编号)
4.变量的值:内存单元里放的内容
四、变量可代表的意思
1.代表变量的值:右值----->pringtf("%d\n",a);
2.代表变量的内存单元:左值----->变量的地址
五、整数存储方式
整数在计算机内以二进制补码存储
原码即数据转化为二进制
6: 0000 0000 0000 0000 0000 0000 0000 0110
补码:
正数补码是原码
负数补码是它的绝对值的原码取反加一
-6:1111 1111 1111 1111 1111 1111 1001--->取反
1111 1111 1111 1111 1111 1111 1001--->加一
4294967290:
和-6补码一样
printf("%d\n", -6);
printf("%u\n", -6);
六、Int 有符号整形
最高bit位是符号
其它bit位是数据
总结:42944967290 + 6 = 4294967296=2^32
七、浮点数存储方法
符号位 指数位 科学计数小数部分
0/1 1bit |
符号由127中间节点控制 0~255 8bit |
23bit 空余位在后边补0 |
以12.5进行分析
1.转换成二进制是什么
1100.1
1 * 2^-1 = 1/2 = 0.5
2.变为科学计数(方法和十进制一样)
1.1001 * 2^3
八、整数之间赋值问题
int a = -6;
//sizeof(a) <=> sizeof(int0 = 4
short int b = 100;
short int c = 200;
b = c;//相同类型数据进行赋值
类型相互兼容两个数据相互赋值
b = a; 长给短赋值 a会多一部分
a = b; 短给长赋值 空余一部分
(1)长给短赋值
低位直接拷贝copy ,高位 直接扔了
int a =123888;32位 //0...0 0001 1110 0011 1111 0000
short b = a; 8位 //1110 0011 1111 0000
hd 有符号短整型
hu 无符号短整型
printf("%hd\n",b); //-7184 0001 1100 0001 0000
printf("%hu\n",b); //58352
练习:
int a = 360; // 0001 0110 1000
char c = a; // 0110 1000 --> 104
printf("%c",c); // -->'h'
溢出:
char c = 358; //0001 0110 0110
c 只有一个字节 8 bit 超出的bit位 直接舍弃
c // 0110 0110 --> 'f'
(2)短给长赋值
分情况讨论
对于短数据是有符号,长数据高位全部补符号位(短数据)
short a = 12;
int b = -4;
b = a; //补 a 的符号位
对于短数据是无符号,长数据高位全部补0
------------------------------------------
int a = -6;
short b = -100;
sizeof(b) = 2
//-100(原码):1000 0000 0110 0100
//100(原码) :0000 0000 0110 0100
//取反:1111 1111 1001 1011
//加1:1111 1111 1001 1100
a=b;
//短给长,有符号,前面补符号位。
//a:1....1 1111 1111 1001 1100
printf("%d\n",a);-100
//打印原码对应的值 负数补码-1取反(最高bit位不变)
//10...0 0110 0100 -100
printf("%u\n",a);
//a(补) = 1...1 1111 1111 1001 1100
//2^32-100 = 4294967196
-------------------------------------
int a = -6;
unsigned short b = -100;
//-100(原码)1000 0000 0110 0100
//100(原码)0000 0000 0110 0100
//取反:1111 1111 1001 1011
//+1: 1111 1111 1001 1100 (-100的补码)
a = b; // a(补) = 0...0(无符号前面补0) 1111 1111 1001 1100
printf("%d\n",a); // a(原) = 0...0 1111 1111 1001 1100
printf("%u\n",a); // a(原) = 0...0 1111 1111 1001 1100
练习
printf("%d\n",-1);
// 默认 int
// -1(原) 1...0 0001
// 取反 1...1 1110
// 加1 1....1 1111
//打印原码对应的值 负数补码-1取反(最高bit位不变)
// 有符号整型打印 -1
printf("%u\n",-1);
// 默认 int
// 1111...1111
// 无符号整型打印 2^32 - 1
printf("%d\n",-1u);
// -1(补) 1111...1111
// -1u(无符号-补) 1111...1111
// 有符号整型打印 -1
printf("%u\n",-1u);
// -1(补) 1111...1111
// -1u(无-补) 1111...1111
// 无符号整型打印 2^32 - 1
printf("%d\n",(char)-1);// (char)-1 1111 1111
// -1(补) 1111...1111
// (char)-1(补) 1111 1111
// 有符号打印,短->长 8bit->32bit 补符号位
// 1111...1111
// 有符号整型打印-1
printf("%u\n",(char)-1);
// (char)-1(补) 1111 1111
// 8bit --> 32bit 有符号
// 1111...1111
// 无符号整型打印 2^32 - 1
printf("%d\n",(unsigned char)-1);
// -1(补) 1111...1111
// (unsigned char)-1 1111 1111
// 有符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255
printf("%u\n",(unsigned char)-1);
// -1(补) 1111...1111
// (unsigned char)-1 1111 1111
// 无符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255
printf("%d\n",(char)255);
// 255(补) 000...000 1111 1111
// (char)255(补) 1111 1111
// 短变长 11...11 1111 1111
//有符号整型打印-1 打印原码对应的值 负数补码-1取反(最高bit位不变)
printf("%u\n",(char)255);
// 255(补) 000...000 1111 1111
// (char)255(补) 1111 1111
// 短变长 11...11 1111 1111
// 无符号整型打印 2^32 - 1
printf("%d\n",(unsigned char)255);
// 255(补) 000...000 1111 1111
// (unsigned char)255(补) 1111 1111
// 短变长 无符号型加0 0000...0000 1111 1111 ---> 255
// 有符号整型打印255