前言:
此刻大家对“你不知道的c语言”大约比较关怀,小伙伴们都想要学习一些“你不知道的c语言”的相关知识。那么小编同时在网上汇集了一些关于“你不知道的c语言””的相关内容,希望我们能喜欢,我们快快来了解一下吧!一:数据类型
C语言的基本数据类型
int
short
float
double
char
long
1、什么是数据类型 :在C语言中 数据类型是指用于声明不同类型变量或者函数的一个广泛系统, 决定数据范围和含义的指标
变量的类型决定这个变量所占内存空间大小以及存储方式!
2、数据类型是用来做什么的: 数据类型就是为了定义变量而设计的!
3、C语言中的几种数据类型(分为四种):
序号 类型 描述
1 、基本类型 就是算术类型 就是能够参与运算的类型 包括了 整型和 浮点型
整型: int short long char 以上都可以使用 signed or unsigned 修饰
浮点型: float(单精度) double(双精度)
2、 枚举类型 其实也是一种算术类型 被用来定义在程序中只能赋予一定离散值的数据变量
ex: 星期 只能取 7个值 1 2 3 4 5 6 7 只能取这七个值
3、 空类型 void类型即空值类型 表示这个变量没有可以取的值 则用void定义变量毫无意义
ex: void v; 不对 v 没有取值 所以无意义
派生数据类型 数组 指针 结构体 共用体 ...
4、数据 : 常量 和 变量
4.1 常量: 在程序的运行过程中其值不可以变的量称之为常量
ex: 1 3 5.12 0x12 025 10e3 ....
ex: #define PI 3.14 PI 叫符号常量
什么是符号常量:用一个符号来表示一个常量 这个符号叫做符号常量
如果执行 PI = 6.22 ; //对不对 不对 常量的值 不可以改变
4.1.1 整型常量:
表示方法不同有多种:3个2进制位表示 1个八进制
4个2进制位表示 1个十六进制位
二进制表示 仅由 01 组成 使用 B区分
八进制表示 仅由 0-7 组成 使用 O区分 以 0打头
十进制表示 仅由 0 - 9 组成
十六进制表示 仅由 0 - F 组成 使用 0x打头
注意:进制只是数的表现形式 其与 数的大小和存储没有任何关系
5 05 0x5 大小没有区别 都是 5
12 014 0x0C 这三个大小和存取都没有区别 都表示 12
12 012 0x12 就不一样了 12 10 18 大小不同
4.1.2 字符常量( 所有使用 '' 单引号引起来的若干字符都是字符常量
字符在存储形式上 是以ASCII码的方式存储的
ex: 'A' 'a' '0' '\n' '\0123'
注意:
0 == '\0'
0 == NULL // 0这个值表示的 字符是 NULL 与 '\0'
‘0’==48 //字符0的ASCII码值是48
注意:
转义字符( 为了区别含义上的不同有些相同的字符需要转义
常见的转义字符:
'\r' 回车
'\n' 换行
'\v' 垂直制表符
'\t' 水平制表符 相当于 tab
'\b' 退格
'\\' \
'\'' '
'\"' "
......
4.1.3 浮点常量 有多种表示方式
1、十进制表示 0.12 0.56 0.125 1.56 ...
2、指数表示方式 即由十进制+阶码组成 中间使用e / E表示
ex: 2.5e6 =>2.5 *10^6
1.0E-2 => 1.0 *10^-2 = 0.01
一般遇到的常量就是以上的三种常量:
注意 整型常量类型 统一为 int
字符常量类型 可能是 char 也可能是int 这个根据不同运算确定 (后面详细讲解)
浮点常量类型 统一为double
4.1.4 常量的输出打印 (对于输出我们使用标准输出输出到终端or屏幕
整型常量 使用%d打印
字符常量 使用%c打印
浮点常量 使用%lf打印 // 浮点常量类型 统一为double
4.2 变量 (变量的使用 一定是先定义声明 后使用
定义:在程序的运行过程中 值可以被改变的量叫做变量
***变量的实质:代表内存空间中具有特定属性的一块内存单元,用于存放一个数据到该内存单元中
这个存储的数据叫做变量的值 这个值可以被更改!
***变量名:实质上就是为了区分不同的存储单元 而设计的一个标识
这个标识符就是变量名,其标识的是一块存储单元,使用 &变量名 来获取地址
ex: int a = 10;
意思是 在内存空间中开辟一块内存单元 这个内存单元的属性是 int 存储的值为10
a标识的内存空间地址 就是 &a 如果要知道具体的 可以使用%p打印地址出来
scanf("%d",&a);的含义: 从外部获取一个值 存储到 a的地址 就变成了 a的值
此处的地址叫做虚拟地址,是计算机操作系统对于存储空间的编号,
这个编号每次都会分给不同的程序
********************关键内容*****************
变量的访问:
ex: int a;
a = 10; //给 a这个变量赋值
int b = a; //将 a的值 赋值给 b
1、存储:即讲一个值赋值给变量 这个过程是存储 存储的时候变量名一般都在左边
所以称之为 引用变量的左值
2、读取:即将该变量的子赋值给其他变量 这个过程叫做读取 读取的时候变量名一般都在右边
所以称之为 引用变量的右值
左值 代表:代表存储空间
右值 代表:代表存储空间中的值
**********************************************
4.2.1 整型变量 (无论是整型 or短整型 or长整型都可以使用 signed 与 unsigned 修饰!
使用signed修饰的时候 signed可以缺省:
重要:整型数据在计算机内存中的存储方式 是以二进制的补码方式存储的!
无论正负都是以补码方式存储
正数的补码就是源码
负数的补码就是其绝对值的反码+1
对于无符号的数据 就是存储 源码! 没有-
有符号数据最高位是符号位: 对于整个运算过程中而言符号位参与运算!
在x86 32位机器上:
int 占4字节 表示范围为 - 2^31 ---- 2^31-1
short 占2字节 表示范围为 -2^15 ---- 2^15-1
long 占4字节的 表示范围同 int
long long 占8字节 -2^63 --- 2^63-1
思考:
1、请问 int类型的 最大值在内存中的存储应该长什么样?
必须是正数 正数的符号为 0 其他位数据 全为1
0 111 1111 1111 1111 1111 1111 1111 1111
1符号位 -------------------------------------- 全1才能最大
2、请问最大的负数怎么表示?就是 -1
1 111 1111 1111 1111 1111 1111 1111 1111 最大的负数
-1 负数 |-1| = 1 0000 0000 0000 0000 0000 0000 0000 0001
1111 1111 1111 1111 1111 1111 1111 1110
1111 1111 1111 1111 1111 1111 1111 1111
3、请问最小的负数怎么表示?
1 000 0000 0000 0000 0000 0000 0000 0000
1符号位 -------------------------------------- 后面全为0 则是最小的负数
最小负数是多少 返回 先减1 再取反 得到绝对值的源码 再加-号
0 111 1111 1111 1111 1111 1111 1111 1111
1 000 0000 0000 0000 0000 0000 0000 0000 //绝对值的源码 - 2^31
拓展: 介绍一个运算符 sizeof()
注意 sizeof 并不是函数 而是一个运算符 是用来求一个数据类型所占存储空间的
sizeof('a') = 4
4.2.2 字符变量
定义格式: char 变量名;
ex: char ch = 'a';//定义了一个字符变量 ch 赋值为 'a';
char c = 97; //定义了 一个字符变量 c 赋值为 97
//这里的c 与ch 完全等价 因为 'a' 的ASCII值为 97 因此得出结果 97 等价于 'a';
原因在 计算机计算中 能够参与运算的只有 int double 偶尔有float
这里的 'a' 本质就是 97
字符变量在内存中的存储同样遵守整型变量的存储规则
即char型也是整型 只不过是一个8位整型 每一个数据 都对应一个含义 就是ASCII
相当于约定了 一个编号 这个编号对应每一个具体的字符:
练习: unsigned char c = 256; //成立吗?如果不成立请说明原因
unsigned char 的取值为 0 - 2^8 - 1 =》0 - 255
所以在逻辑上 256超过了255 不成立 因为存储不下 但是在运行中不会有错
ex: unsigned char c = 256;
printf("c = %d\n",c);
报警告:warning: large integer implicitly truncated to unsigned type [-Woverflow]
unsigned char c = 256;
//超出了能够表示的范围 即长赋值给短,则只赋值低位
练习: unsigned char ch = 128;
printf("%d",ch); ===> 128
char c = 128;
printf("%d",c); ====> -128
1000 0000 => 这是一个负数 最高位符号位 为 1 为负数 推回源码
先-1 再取反 得出结果是1 000 0000 =》128 由于是负数 所以是 -128
4.2.3 浮点变量
单精度 float 占四个字节 32位 自动保留6位小数
双精度 double 占8个字节 64位 自动保留6位小数 但是精度可以再衍生
浮点数怎么存储: 所有人都需要知道 浮点数的存储遵守国际标准 IEEE754
到底如何存储 以下内容如果可以看懂 就看懂 看不懂没有任何关系:
浮点数的存储 使用二进制的科学计数法:N = (-1)^s *1.M * 2^(E-偏置量)
每一个数据对应的位如下:
类型 符号位s 阶码E 尾数M 总位数 偏置量
float 1 8 23 32 127
double 1 11 52 64 1023
一个浮点数的存储: ex: 12.456
temp1: 整数部分转化为 二进制
1100
temp2: 小数部分转化为 2进制
拿小数部分*2 依次取出来的整数 取到没有小数为止 有些是取不尽的则取23位即可
ex::0.456 就是取不尽的
0.456*2 = 0.912 0
0.912*2 = 1.824 1
0.824*2 = 1.648 1
0.648*2 = 1.296 1
0.296*2 = 0.592 0
0.592*2 = 1.184 1
.............
0.456 =》 .0111 0100 1011 1100 0011 0101
temp3:将小数和整数整合在一起
1100.0111 0100 1011 1100 0011 0101
temp4: 表示成 1.M的形式 如果小数点往左移 则记录移位次数为 +
如果小数点右移 则计算依次次数为 -
1.1000111 0100 1011 1100 0011 0101 =》 1.M
小数点挪了 +3位
temp5:求阶码
E = 偏置量 + 移位个数
E = 127 + 3 = 130
转化为 2进制
000 0010 =》 1000 0000 + 10 =》1000 0010
temp6:求尾数 小数点后的23位
1000 1110 1001 0111 1000 011 //23位
temp7 整合表示: 符号位 阶码E 尾数
0 1000 0010 1000 1110 1001 0111 1000 011
以上就是 12.456 在计算机中的存储
4.2.4 变量的打印
1、整型变量的打印: 同整型常量的打印 只不过将常量换为变量名即可
如果是一个无符号的整数,需要以无符号的方式打印 使用%u 打印
ex: int a = 5;
printf(" %d , %d\n",10,a); => 10 ,5
除了以 %d 打印外 %d 可以约定打印数据的位数 ex: %3d %6d ...
测试:short s = 65535; 是16位数据中的全1
1111 1111 1111 1111 就是最大的负数 -1
printf("s = %u,s = %d\n",s,s); => 思考是多少?
s = 0xFFFFFFFF ,s = -1;
原因:这是一个 短赋值长的问题 高位补全1
2、浮点数据的打印 与浮点常量的打印类似
float 类型使用 %f 打印
double 类型使用 %lf 打印
注意: %x.yf 含义为 整数部分为 x位 小数部分为 y位 小数自动四舍五入!
3、字符变量的打印 同 字符常量的打印
————————补充:长赋短短赋长问题 ————————
长赋短 ex: 259 //整型常量 并且是一个 >0 的数 正数 存储的时候存储源码
1111 1111
0100
———————》 1 0000 0011 259的源码
char c = 259; =》 C占一个字节 8位
而259占 9位 存储不下只存储底八位
存储 0000 0011 =》符号位为0 正数 即为3
短赋长 短的直接赋值进去 高位根据数据情况来补
无符号数:高位补0
有符号数:高位补符号位
ex: short s = 65535;
printf("%u,%d\n",s,s);
//65535 是一个整型常量 > 0 数 源码 //整型是4字节
0000 0000 0000 0000 1111 1111 1111 1111
s占两个字节 所以 应该只存储低16位
1111 1111 1111 1111 //这是一个有符号的数
无论是%d 还是 %u 都是打印32位数的
%d 最高位为符号位 表示一个负数 推回源码 先-1 再取反
1111 1111 1111 1110
0000 0000 0000 0001 =》1 =》-1
%u 转成无符号32位数据 但是 s本身是一个有符号的整数 补全的时候补符号位
1111 1111 1111 1111
补充16个1 再高16位
1111 1111 1111 1111 1111 1111 1111 1111
------------------------------
补的符号位
ex: char c = 129; //
short s = c;
printf("%d",s);
129是一个大于0的整数 存储 是一个长赋短的问题
1000 0001
C里面存储 1000 0001 并且是一个有符号的数据 存储到s中
s = 1111 1111 1000 0001
-127
————————————————————————————
5.C语言中不同类型赋值的问题
5.1 范围大的赋值给范围小的 只取低字节赋值 长 赋 短
ex: char c = 256;
将256这个值存储到 c表示的空间中
256的源码是 1 0000 0000
但是char只能存储 8位数据 所以取后面的 8位存储 8个0存储
c 的值最终为 0!
练习: short s = 632767;
printf("%s\n",s);
5.2 范围小的 赋值给范围大的 即 短 赋 长
ex: char c = 129;
int x = c;
printf("%d",x); x = -127?
因为char类型范围是-128到127,129超出了char的表达范围,char到127之后如果再加1,就成了-128了,129是给127加了2,所以就成了-127了,也就是说,当值超过数据类型表达范围的时候,比如说达到了最大值,如果再加1的话,就回到了最小值
规则:无符号数据 短赋长 赋值到低字节 高位全部补0
有符号数据 短赋长 赋值到低字节 高位全部补符号位
c = 129;
129 的源码是 1000 0001 c中存储这个数据
这个数是一个 负数
1000 0001 是负数 则当做补码 推回源码 -1 再取反
1000 0000 取反 0111 1111 =》127 是 -127
赋值给 x x的值 在高位补符号位
1111 1111 1111 1111 1111 1111 1000 0001 // 1是符号位 高位全部补1
减1 再取反 1111 1111 1111 1111 1111 1111 1000 0000
0000 0000 0000 0000 0000 0000 0111 1111 127 所以 是 -127
5.3 浮点数据 赋值给整型数据 只赋值整数部分 小数部分丢弃
5.4 整型数据 赋值给浮点数据 则 小数部分为 0
介绍几个基本的函数:// char ch = getchar(); 相当于scanf("%c",&ch);
printf
scanf 注意 scanf中除了占位符之外 其他的符号都不要加
putchar /getchar
ex: char c = 'a';
putchar(c); 即可完成输出 c的值
putchar('0');即可输出字符 0
putchar(48);即输出 0
标签: #你不知道的c语言 #c语言组成最大数是多少 #号c语言中是什么意思 #c语言数组用什么数据类型 #c语言数组用什么数据类型比较好