C语言的数据类型

本文详细介绍了C语言中的数据类型,包括基本数据类型如整型、浮点型、字符型及其不同表示,以及常量的分类和存储。还探讨了变量的定义、内存存储和赋值过程中可能涉及的类型转换和溢出问题,特别是整数的补码表示法。
摘要由CSDN通过智能技术生成

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

为什么没有二进制?

二进制写起来太长了,其次就是转换起来简单

0123

01 010 011

01 111 111 101

01 775

0x 123

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.012.小数部分为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

为了修改方便,并且不会改变其他的实际需要用的数值

作业:把今天内容消化一下,

试一下每个格式说明,看看现象

打印相关字符

3、变量

在程序运行期间,它的值可改变、被修改

变量会对应的一个可读可写的内存单元

int a;

char c;

float b;

a,b,c 都是变量

变量用来保存数据,既然需要保存数据,是不是得有地方储存(内存空间)

这个内存空间需要多大?

需要根据这个变量的类型的类型来决定的。

所以,我们定义变量的时候,就需要指定好类型。

变量的定义格式:

数据类型 变量名 [= 变量的初始值];

int a;

定义了一个变量,它的名字是 a ,int 变量。没有初始值

是一个随机的数值

int b = 5;//只有在定义的时候给数据才叫初始化

定义了一个变量,它的名字是 b ,int 变量。赋了初始值5

char c;

c = 45;

float f;

C语言标识符:

只能由数字、字母、下划线组成,并且不能由数字开头。

% * & ...不支持

int a*a; //错误

为了避免产生歧义,还有不能使用C语言内部标识符。

变量属性:

数据类型 :任意的C语言数据类型

变量名: 必须符合c语言标识符的规定,且不能是C语言关键字

变量的内存单元:

用来保存这个变量数据的存储空间,这个存储空间会有

一个地址(编号)

变量的值:变量的内存单元里面的内容

对变量的访问:

int a = 100;//1

int b;

b = a;//a的值给b//2

a = 150;//把100覆盖//3

printf("%d\n",a);//4

在C语言任何的变量都有2个意思

1、代表变量的值:右值

a第二种情况、a第四种情况

2、代表变量的内存单元(变量的地址) :左值

a的第一种情况、a的第三种情况

试一下:“%d”打印一个小数

4、整数(char)的存储方式

整数在计算机内中以二进制的补码存储

原码:把整数换成二进制就好了

6:0000 0000 0000 0000 0000 0000 0000 0110

补码:

正数的补码就是原码

6:0000 0000 0000 0000 0000 0000 0000 0110

负数的补码是它的绝对值 的原码 取反 +1

-6 :

绝对值 的原码取反:

1111 1111 1111 1111 1111 1111 1111 1001

+1:

1111 1111 1111 1111 1111 1111 1111 1010

练习一下:

求一下1234和-1234的补码

1024 + 128 + 64 + 16 + 2

1234:0000 0000 0000 0000 0000 0100 1101 0010

-1234:

绝对值原码取反:

1111 1111 1111 1111 1111 1011 0010 1101

+1:

1111 1111 1111 1111 1111 1011 0010 1110

4294967289的补码

1111 1111 1111 1111 1111 1111 1111 1001

4294967290的补码

1111 1111 1111 1111 1111 1111 1111 1010

和-6的补码一样?

是不是说明他们在内存的存储形式是一样的呢?

如果内存中存了1111 1111 1111 1111 1111 1111 1111 1010

那么它代表那个数?-6? 4294967290?

printf("%d",-6);

printf("%u",-6);

int 有符号整型

最高bit位是符号 0为正 1为负

其他bit位是数据

1111 1111 1111 1111 1111 1111 1111 1010

是有符号的数据,意味是一个负数

得到它的本身的值

负数求补码的操作反过来

-1:

1111 1111 1111 1111 1111 1111 1111 1001

取反:

0000 0000 0000 0000 0000 0000 0000 0110 --> 6

-6

unsigned int 无符号整型

所有bit位都是数据

以上规则是人定的,计算机是没有这个概念的,到底怎么处理就得看

编译器的词义。

4294967290 + 6 = 4294967296 = 2^32

4294967289 + 7 = 4294967296

浮点数存储方式

以 12.5 float分析

转换成二进制是什么

1100.1

1 * 2^-1 = 1/2 = 0.5

变为科学计数(方法和十进制一样)

1.1001 * 2^3

有三部分需要保存好 不需要保存小数点左边的,因为全是1

符号位 1bit

指数位 8bit符号由127中间节点控制 0~255

科学计数小数部分23bit 空余位在后边补0

0.125 转换位二进制科学计数

1 * 2^-3

指数位 : 127 + 指数值

5、整数之间赋值问题

int a = -6;

//sizeof(a) <=> sizeof(int) = 4

short int b = 100;

short int c = 200;

b = c;//相同类型数据进行赋值

类型相互兼容两个数据相互赋值

b = a;长给短赋值 a会多一部分

a = b;短给长赋值 空余一部分

(1)长给短赋值

低位直接拷贝copy ,高位 直接扔了

int a = 123888;//0..0 0001 1110 0011 1111 0000

short b = a;//1110 0011 1111 0000

hd 有符号短整型

hu 无符号短整型

printf("%hd\n",b);//-7184

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;//01100100

a = b;// 0...0 0110 0100

printf("%d\n",a);

printf("%u\n",a);

------------------------

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 (-100的补码)

a = b;

//短给长 有符号 前面补符号位

//a(补) = 1...1 1111 1111 1001 1100

printf("%d\n",a);

// 打印原码对应的值 负数补码-1取反(最高bit位不变)

//10...0 0110 0100 -100

printf("%u\n",a);// 2^32 - 100 = 4294967196

//a(补) = 1...1 1111 1111 1001 1100

//无符号 所有bit位都是数据

------------------------------

int a = -6;//

unsigned short b = -100;//b(补) = 1111 1111 1001 1100(无符号)

//sizeof(b) = 2

//-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 1111 1111 1001 1100

printf("%d\n",a);//a(原) = 00...0 1111 1111 1001 110065436

printf("%u\n",a);//a(原) = 00...0 1111 1111 1001 110065436

练习:

printf("%d\n",-1);

//默认 int

// 1111...1111

//有符号整型打印 -1

printf("%u\n",-1);

//默认 int

// 1111...1111

//无符号整型打印 2^32 - 1

printf("%d\n",-1u);//-1u unsigned -1

// -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);

//-1(补) 1111...1111

//(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

// 有符号整型打印 0000...0000 1111 1111 ---> 255

printf("%u\n",(unsigned char)-1);

// -1(补) 1111...1111

// (unsigned char)-1 1111 1111

// 无符号整型打印 0000...0000 1111 1111 ---> 255

printf("%d\n",(char)255);

//255(补)000...000 1111 1111

//(char)255(补)1111 1111

// 11...11 1111 1111

// 有符号整型打印 -1

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

//000...000 1111 1111

// 有符号整型打印 255

char 取值范围-128 ~127

unsigned char取值范围0 ~255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新棉衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值