龙空技术网

一篇文章学会C语言中的基本数据类型

Antonov 19

前言:

此刻大家对“你不知道的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语言数组用什么数据类型比较好