C语言——数据类型

数据类型

Day1

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

为什么没有二进制?

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

0 1 2 3

01 010 011

01 111 111 101

01 7 7 5

0x 1 2 3

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

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

Day2

一、变量

定义:在程序运行期间,它的值可以被改变,被修改。

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

内存单元由变量的类型来决定。

定义格式:

数据类型 变量名(=变量的初始值)

Int b=5;定义时才叫初始化。

二、c语言标识符

定义:只能由数字,字母,下划线组成,不能由数字开头

不支持如%,*,&  不能使用c语言内部标识符

三、变量属性

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

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

3.变量内存单元:用来保存变量数据的存储空间,这个存储空间会有一个地址(编号)

4.变量的值:内存单元里放的内容

四、变量可代表的意思

1.代表变量的值:右值----->pringtf("%d\n",a);

2.代表变量的内存单元:左值----->变量的地址

五、整数存储方式

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

原码即数据转化为二进制

6: 0000 0000 0000 0000 0000 0000 0000 0110

补码:

正数补码是原码

负数补码是它的绝对值的原码取反加一

-6:1111 1111 1111 1111 1111 1111 1001--->取反

       1111 1111 1111 1111 1111 1111 1001--->加一

4294967290:

和-6补码一样

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

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

六、Int 有符号整形

最高bit位是符号

其它bit位是数据

总结:42944967290 + 6 = 4294967296=2^32

七、浮点数存储方法

 符号位 指数位 科学计数小数部分

0/1

1bit

符号由127中间节点控制 0~255

8bit

23bit 空余位在后边补0

  以12.5进行分析

1.转换成二进制是什么

1100.1

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

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

1.1001 * 2^3

 八、整数之间赋值问题

int a = -6;

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

short int b = 100;

short int c = 200;

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

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

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

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

(1)长给短赋值

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

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

short b = a; 8位 //1110 0011 1111 0000

hd 有符号短整型

hu 无符号短整型

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

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;

sizeof(b) = 2

//-100(原码):1000 0000 0110 0100

//100(原码) :0000 0000 0110 0100

//取反:1111 1111 1001 1011

//加1:1111 1111 1001 1100

a=b;

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

//a:1....1 1111 1111 1001 1100

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

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

//10...0 0110 0100 -100

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

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

//2^32-100 = 4294967196

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

int a = -6;

unsigned short b = -100;

//-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(无符号前面补0) 1111 1111 1001 1100

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

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

练习

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

// 默认 int

// -1(原) 1...0 0001

// 取反 1...1 1110

// 加1 1....1 1111

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

// 有符号整型打印 -1

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

// 默认 int

// 1111...1111

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

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

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

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

// 有符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255

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

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

// (unsigned char)-1 1111 1111

// 无符号整型打印 短变长 无符号型加0 0000...0000 1111 1111 ---> 255

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

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

// (char)255(补) 1111 1111

// 短变长 11...11 1111 1111

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

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

// 短变长 无符号型加0 0000...0000 1111 1111 ---> 255

// 有符号整型打印255

上一篇:二进制中1的个数


下一篇:WPF单表删除