常量 - 不会变化的数据
- “hello” ‘A’ 10 3.14
- #define PI 3.14 //采用宏定义的方法 定义一个常量
- const int a = 10;
求圆的面积和周长
#include <stdio.h>
#define PI 3.14
int main(void)
{
//圆的面积 s = r * r * PI
int r = 3;
float s = PI * r * r;
//圆的周长 l = 2 * PI * r
float l = PI * r * 2;
printf("圆的面积是%f\n",s);
printf("圆的周长是%f\n",l);
//保留小数点后两位
printf("保留小数点后两位后的结果,对第三位进行四舍五入后的结果\n");
printf("圆的面积是%.2f\n",s);
printf("圆的周长是%.2f\n",l);
return 0;
}
变量 - 会变化的数据
定义语法
类型 名 变量名 = 变量值;
int x = 123;
变量三要素
- 类型名
- 变量名
- 变量值 可以使表达式,也可以是常量
存储空间
每一个存储空间都有 0xaabb 类似的指针指向的地址
空间大小由变量类型决定,比如说int是 4 字节
变量的定义和声明区别
定义是赋值了
int x = 123;
声明没有赋值
int a;
或
extern int a; 有 extern关键字就不会提升为定义了
区别:
- 变量定义会开辟内存空间
- 变量 声明不会开辟内存空间,变量没定义,使用之前会自动寻找变量声明提升为定义
- 变量要想使用,必须要定义,没写就自动给值
标识符
命名规则
- 常量 大写
- 变量 小写
- 只能使用字母,数字,下划线(_)
- 数字不能开头
整型
定义
short
int
long
long long
输出
%d
sizeof求占用空间大小
#include <stdio.h>
int main(void)
{
short s = 1;
int a = 40;//
long l1 = 111111;
long long ll1 = 9999999999999999999;
printf("short大小为:%d个字节\n",sizeof(s));
printf("int大小为:%d个字节\n",sizeof(a));
printf("long大小为:%d个字节\n",sizeof(l1));
printf("long long大小为:%d个字节\n",sizeof(ll1));
printf("short大小为:%d个字节\n", sizeof(short));
printf("int大小为:%d个字节\n", sizeof(int));
printf("long大小为:%d个字节\n", sizeof(long));
printf("long long大小为:%d个字节\n", sizeof(long long));
return 0;
}
输出
short大小为:2个字节
int大小为:4个字节
long大小为:4个字节
long long大小为:8个字节
short大小为:2个字节
int大小为:4个字节
long大小为:4个字节
long long大小为:8个字节
有符号整型signed 有符号可以为正数或负数
超级不常用
signed int a = 10;
无符号类型unsigned 无符号一定是正数
unsigned int a = 10; //表示a 一定是无符号,指的是数据量,不表示方向(没有正负 )
数据类型
整数类型总结
有符号类型signed
short %hd 2字节
int %d 4字节
long %ld 4字节 Windows32位和64位都是4字节,linux 32位是4字节,64位是8字节
long long %lld 8字节
无符号类型unsigned
unsigned short %hu 2字节
unsigned int %u 4字节
unsigned long %lu 4字节 Windows32位和64位都是4字节,linux 32位是4字节,64位是8字节
unsigned long long %llu 8字节
字符类型char
char c = ‘A’ ;//单引号
#include <stdio.h>
int main(void)
{
char c = 'A';
printf("%c\n",c); //A
printf("%d\n",c); //65
c = '#';
printf("%c\n",c); //#
printf("%d\n",c); //35
c = 97;
printf("%c\n", c); //a
printf("%d\n", c); //97
return 0;
}
大小写转换
#include <stdio.h>
int main(void)
{
//大小写转换 差32
char c = 'M';
printf("%c\n", c);
c += 32;
printf("%c\n",c);
return 0;
}
认识几个重要字符
‘A’ 65
‘a’ 97
‘0’ 48
‘\n’ 10
‘\0’ 0
转义字符: ‘\’ 反斜杠,将普通字符转为特殊意义,也可以反转
浮点型,小数型
单精度浮点型float 4字节
定义
float f = 1.234f
尾不加 f 默认是 double
默认保留6位小数
无符号的单精度浮点型
unsigned float f = 4.234
输出时候
用%f
用%.3f 控制小数点后位数
用%5.3f 控制小数点后位数,和所占的空间
用%05.3f 控制小数点后位数,和所占的空间,不足的地方用0表示
双精度浮点型double 8字节
定义
double d = 5.324534
无符号的双精度浮点型
unsigned double d = 5.7545
输出时候
用%lf
用%.6lf 控制小数点后位数
用%8.6lf 控制小数点后位数,和占8位空间
用%08.6lf 控制小数点后位数,和占8位空间,不足的地方用0表示
有符号类型
#include <stdio.h>
int main(void)
{
float f = 3.14f;
double d = 4.566;
//默认输出小数点后6位
printf("%f\n", f); //3.140000
printf("%lf\n", d);//4.566000
//可以通过.的方式限制小数点后面位数,多余的 四舍五入,不够的用0补上
printf("%.2f\n",f);//3.14
printf("%.3lf\n",d);//4.566
//可以通过前面固定占几位的空间
printf("%5.2f\n", f);// 3.14
printf("%6.3lf\n", d);// 4.566
//可以通过前面固定占几位的空间,不足的地方用0补齐
printf("%05.2f\n", f);//03.14
printf("%06.3lf\n", d);//04.566
}
科学计数法赋值
float f = 2.3e3f
float f = 2.3e-3f
进制转换
计算机内部存储 - 二进制
十进制转二进制:
除二反向取余
二进制转十进制
按照 1*2的次幂来 相加,如果位上是0 就不相加了
2^10 = 1024
2^9 = 512
2^8 = 256
2^7 = 128
2^6 = 64
2^5 = 32
2^4 = 16
2^3 = 8
2^2 = 4
2^1 = 2
2^0 = 1
八进制转十进制
定义八进制的语法:
056:零开头,每位数是0-7之间
每一个位是8的几次方
0 5 6
5个8的一次方 = 40
6个8的零次方 = 6
结果46
八进制转二进制: 三位421法
除二反向取余
056 对应二进制
按照421来,一个8禁止为对应三位二进制
5的二进制是 101
6的二进制是 110
8进制056的二进制是
101 110
八进制05326转二进制
101011010110
二进制转换八进制
三位一组转换成8进制,从右往前分
001 101 010 101 001
1 5 2 5 1
015251
十六进制转十进制
十六进制表示方法:
0xFD89A2
A–10
B–11
C–12
D–13
E–14
F–15
16^5 16^4 16^3 16^2 16^1 16^0
0x F D 8 9 A 2
1048576x15 + 65536x13 + 4096x8 + 256x9 + 16x10 + 1 x 2
=15728640 + 851968 +32768 +2304 +160 +2
=16615842
十六进制转二进制 四位8421法
0x 1A
1 A
0001 1010
00011010
二进制转16进制 四位一算
0101 0101 1001 0010 1110
0x 5 5 9 2 E
0x5592e
输出格式统计
格式 | 表示 | 类型 |
---|---|---|
%d | 有符号 - 十进制整型 | int |
%u | 无符号 - 十进制整型 | unsigned int |
%o | 八进制 | |
%x | 十六进制 | |
%hd | 有符号 - 短整型 | short |
%hu | 无符号 - 短整型 | unsigned short |
%ld | 有符号 - 长整型 | long |
%lu | 无符号 - 长整型 | unsigned long |
%lld | 有符号 - 长长整型 | long long |
%llu | 无符号 - 长长整型 | unsigned long long |
%c | 字符型 | char |
%f | 浮点型 | float |
%lf | 双精度浮点型 | double |
%c | 字符 | char |
%s | 字符串 | String |
%m.d | 实型 一共有m位(整数.小数.小数点),n位小数 | |
%0m.d | 实型 一共有m位(整数.小数.小数点),n位小数,前面不足用0表示 |
原码反码补码
原码
特点:
-
最高位为符号位,0表示正,1表示负
-
其他树脂部分就是数值本身绝对值的二进制数
-
负数的原码是在绝对值的基础上,最高位变为1
十进制数 | 原码 |
---|---|
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 | 0000 0000 |
-0 | 1000 0000 |
反码
特点
-
对于正数:反码和原码相同
-
对于负数:符号位不变,其他部分取反0变1,1变0
十进制数 | 反码 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0000 |
+0 | 0000 0000 |
-0 | 1111 1111 |
补码 (现今计算机采用的存储方式)
特点
-
正数的原码反码补码都一样
-
负数的补码是: 反码基础上+1
-
最高位表示符号位
-
其余位取反 + 1
43-27 ==> 43 + -27
00101011
10011011
11100100
11100101
00010000
算出来是二进制16
人为规定
00000000 ==> 0
11111111 ==> -128
char类型 8个比特位,最高表示符号,数值位有7个
最大数值就是-2^7 到 2^7-1 (因为多了一个0) = -2^(8-1) 到 -2^(8-1)-1
-128~127
而无符号位的第一位不用表示符号,就能表示 2^8 - 1(有一个0)个
0 ~255
int类型4x8 = 32比特位个,最高位表示符号,数值位有31个
最大数值就是-2^31 到 2^31-1(因为多了一个0)
-2147483648 ~ 2147483647
无符号整形就是:0 - 2^32 -1 0 ~ 4294967295
long类型 4x8 = 32比特位,最高位表示符号,数值位有31个
最大数值就是-2^31 到 2^31-1(因为多了一个0)
-2147483648 ~ 2147483647
无符号长整形 首位作为数值位了后范围:04294967295(0(2^32-1)
long long类型 8x8 = 64bit
范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)
无符号类型长长整型为 0 ~ 1844 6744 0737 0955 1615 (1844*10^16)
数据溢出
char 取值范围 -128 - 127
char c = 127+1;
= 01111111 +1
=10000000 = -128
10000001 = -127