数据类型相关

  1. 计算机中数据的处理

计算机能处理的数据分为两大类:数值型数据 非数值型数据

  1. 数值型数据的表示方式

2.1 十进制/D

特点:逢10进1 每一位上的数字范围 [0-9]

前导符:没有前导符

例如:100 1234

2.2 二进制/B

特点:逢2进1 每一位上的数字只能是 0 或者 1

前导符:0b

例如:0b1010001 0b1011

二进制转十进制:

0b11101 --> 从右向左 1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4

== 1 + 0 + 4 + 8 + 16

== 29

注意:其他任何进制转10进制都可以使用这种方式,只不过将底数的2 换成对应进制的数字即可,如果熟练可以使用 8421转换 ,8421指的是每一位上1的权重:

0001 -->1

0010 -->2

0100 -->4

1000 -->8

十进制转二进制:

使用辗转相除法(除2取余法)

使用十进制的数据除以2,保留商和余数,然后用商继续除以2,再保留商和余数,依次类推,直到商为0时结束。将得到的余数反向取出,就是对应的二进制数了。

以十进制的29转二进制位例:

2.3 八进制/O

特点:逢8进1 每一位上的数字范围 [0, 7]

前导符:0

例如:0345 0556

八进制转二进制:

方式1:八转十 然后 十转二

方式2:1位八进制对应3位二进制

0357 ---> 0b011101111

二进制转八进制:

从右向左 每3位二进制对应1位八进制,高位不够 补0

0b011010101 ---> 0325

2.4 十六进制/H

特点:逢16进1 每一位上的数字范围 [0, 9] a:10 b:11 c:12 d:13 e:14 f:15

前导符:0x

例如:0xAB12 0x78EF

十六进制转二进制:

方式1:十六转十 然后 十转二

方式2:1位十六进制对应4位二进制

0x78EF ---> 0b0111100011101111

二进制转十六进制:

从右向左 每4位二进制对应1位十六进制,高位不够 补0

0b0001110101010011 ---> 0x1D53

注意:不管几进制的数据,在计算机中都会转换成二进制处理。

例:

int 是数据类型是用来定义变量的,a 是变量名,是自己起的名字

int a = 100; //用十进制的100 给变量a赋值

printf("a = %d\n", a); //%d是十进制的占位符 表示将后面的数据按十进制输出

printf("a = %#o\n", a); //%o是八进制的占位符 # 表示输出前导符

printf("a = %#x\n", a); //%x是十六进制的占位符 # 表示输出前导符

printf 函数没有输出二进制的能力

int b = 0b1010110; //用二进制的数据给变量赋值

printf("b = %d b = %#o b = %#x\n", b, b, b);

int c = 0567; //用八进制的数据给变量赋值

printf("c = %d c = %#o c = %#x\n", c, c, c);

int d = 0xAB12; //用十六进制的数据给变量赋值

printf("d = %d d = %#o d = %#x\n", d, d, d);

执行结果:

  1. 非数值型数据的表示形式

计算机中只能处理二进制的数值型数据,但是实际编程的过程中,也经常会遇到跟多非数值型数据,如人名、企业名、网址等:

"www.baidu.com" "zhangsan" "4399" 'M'

(非数值型数据都是用 单引号或者双引号引起来的)

计算机也需要处理这些非数值型数据,因此需要 ascii ,使用 man ascii 就可以查看ascii码表,按 q 退出,ascii其实就是规定了字符和整数对应的关系,每个字符都有一个对应的整数,叫做该字符的ascii码,实际使用字符的时候,本质上使用的都是该字符对应的ascii码。

常见字符对应的ascii码

'A' ~ 'Z' : 65~90

'a' ~ 'z' : 97~122

'0' ~ '9' : 48~57

'\0' : 0

'\n' : 10

转义字符:

所有字符都可以使用 '\+数字(八进制)' 来表示

除此之外,C语言中还定义一些 '\+字母' 来表示那些无法显示的字符

如 '\n' '\0' '\a' ..

这些就叫做转义字符,因为这些符号已经不是字母本身的含义了。

  1. 词法符号

4.1 关键字

所谓的关键字就是编译器中已经规定好的一些有特殊含义的单词,直接使用即可。

C语言是严格区分大小写的,关键字都是小写的。

4.2 标识符

所谓的标识符就是我们自己起的名字,变量名、函数名、结构体名、共用体名。

命名时要符合标识符的命名规范

1.只能由数字、字母、下划线组成;

2.不能以数字开头;

3.不能和关键字冲突;

命名是尽量做到“望文知意” 。

  1. 数据类型

5.1 C语言的本质

C语言的本质是操作内存。

内存和硬盘区别:

内存:读写速度快 数据掉电丢失 价格贵

硬盘:读写速度慢 数据掉电不丢失 价格便宜

5.2 内存分配的最小单位

字节 Byte。

5.3 数据类型的作用

数据类型的作用相当于模子,决定了由他定义的变量需要操作系统分配多大的内存空间。

5.4 数据类型的分类

基本类型:

字符类型 char %c 1字节

短整型 short %d 2字节

整型 int %d 4字节

长整型 long %ld 32位系统(4字节) 64位系统(8字节)

长长整型 long long %lld 8字节

单精度浮点型 float %f 4字节

双精度浮点型 double %lf 8字节

多精度浮点型 long double %Lf 32位系统(12字节) 64位系统(16字节)

枚举类型 enum

构造类型:

数组 char s[5] int s[10]

结构体 struct

共用体(联合体) union

指针类型:

char *p1

int *p2

int (*p3)[3]

int **p4

大小:32位系统4字节 64位系统8字节

空类型:

void

void *

5.5整数类型

整数类型又可以细分为 char short int long 和 long long 类型

其中每种类型又分为 有符号的(signed) 和 无符号的(unsigned)

不写有无符号时,默认都是有符号的

有符号数 最高位为符号位 符号位为1(负数) 0(正数)

5.5.1 char 字符类型

占用内存空间的大小:1字节 8 bit

能存储的数据范围:

无符号:[0, 2^8-1]

有符号:[-2^7 , 2^7-1]

为了解决正负0的问题,计算机中存储的是数据的补码形式,规定了 10000000 为 -128 的补码,负数比正数多一个,下述类型与之同理。

5.5.2 short 短整型

占用内存空间的大小:2字节 16 bit

能存储的数据范围:

无符号:[0, 2^16-1]

有符号:[-2^15 , 2^15-1]

5.5.3 int 整型

占用内存空间的大小:4字节 32 bit

能存储的数据范围:

无符号:[0, 2^32-1]

有符号:[-2^31 , 2^31-1]

5.5.4 long 长整型

在32位系统中 和 int 一样

在64位系统中 和 long long 一样

5.5.5 long long 长长整型

占用内存空间的大小:8字节 64 bit

能存储的数据范围:

无符号:[0, 2^64-1]

有符号:[-2^63 , 2^63-1]

5.6 浮点型(实型)

就是小数的意思。

float 4字节 单精度浮点型

double 8字节 双进度浮点型

浮点型数据的存储涉及到小数的二进制,比较复杂。

要注意:浮点型存储 存储的是拼凑的近似值

https://blog.csdn.net/weixin_44767670/article/details/118084379?spm=1001.2014.3001.5501

5.7 空类型

void 空类型一般不单独使用,都是配合着指针使用的。

5.8原码、反码、补码转换的问题

数据在存储到计算的过程中,涉及到原码、反码、补码转换的问题;

正数的符号数为0,负数的符号数为1;

原码==给人类看的;

反码==用来转换原码和补码的;

补码==给计算机看的;

无符号数:原码、反码、补码是一样的;

有符号的正数:原码、反码、补码是一样的;

有符号的负数:

反码 == 原码符号位不变,其他位按位取反 (0变1,1变0);

补码 == 反码+1;

规则:存储时看数据(正负),取出时看类型(有无符号)。

  1. 常量

6.1 概念

在整个程序运行的过程中,值不允许发生变化的量。

6.2 常量的分类

前导符 输出时占位符 例如

整型常量

十进制 无 %d %u 1314

二进制 0b 无 0b10101

八进制 0 %o 0765

十六进制 0x %x 0x67EF

浮点型常量

float 单精度浮点型 %f

double 双精度浮点型 %lf (小写的L) 3.14

指数常量 就是科学计数法 %e 4.567e2 --> 4.567*10^2

字符常量 %c 'M'

字符串常量 %s "hello"

标识常量 ----宏定义 #define

6.3 整型常量

long 类型输出要用 %ld;

long long 类型输出要用 %lld;

unsigned 类型输出要用 %u %lu %llu。

6.4 浮点型常量

浮点型常量一般都是有小数部分的。

有两种表示形式:

一般形式: 3.14 5.28

指数形式: [+/-]M.Ne[+/-]T ---> 就是科学计数法

-3.4567e3 ---> -3.4567*10^3 ---> -3456.7

2.345e-2 ---> 2.345 * 10 ^ -2 ----> 0.02345

使用浮点型常量给变量赋值:float a = 3.1415926;默认显示6位小数 超过的部分 四舍五入:printf("a = %f\n", a); //3.141593

也可以使用 %.nf 来表示显示 n位小数,n是一个具体的数据:

printf("a = %.2f\n", a); //3.14

double b = 3.1415926;

默认显示6位小数 超过的部分 四舍五入

printf("b = %lf\n", b); //3.141593

也可以使用 %.nlf 来表示显示 n位小数 n是一个具体的数据

printf("b = %.3lf\n", b); //3.142

小数也可以按指数行数输出

6.5字符常量

所谓的字符常量就是前面说的一个非数值型数据,字符常量必须要用单引号 ' ' 引起来,且单引号中只能引一个字符。字符参与运算时 本质就是其对应的ascii参与运算。

'M' 'h' '8' '\n'

字符就是整型,整型就是字符。

6.6字符串常量

字符串是由连续的一个或多个字符组成的,并且必须用 双引号 " " 引起来:

"www.hqyj.com" "zhangsan" "m"

注意:每个字符串结尾都有一个隐藏的字符 '\0' 用来标识字符串结束的

所以, "hello" 占用的内存空间是 6个字节。

在代码中:

a 变量a

'a' 字符a

"a" 字符串a

6.7标识常量--宏定义

宏定义就是给表达式起一个别名,以后想使用这个表达式的时候,使用别名即可,当表达式需要改变的时候,只需要修改定义处即可,就无须修改整个代码了。

格式:

#define 宏名 宏值

注意:宏定义的名字是一个标识符,要符合标识符命名规范,且一般情况下,宏名都大写。

注意事项:

1.宏定义是在预处理阶段完成替换的;

2.宏定义只是一个简单的替换,无脑替换;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值