Jump to content
  • Hello visitors, welcome to the Hacker World Forum!

    Red Team 1949  (formerly CHT Attack and Defense Team) In this rapidly changing Internet era, we maintain our original intention and create the best community to jointly exchange network technologies. You can obtain hacker attack and defense skills and knowledge in the forum, or you can join our Telegram communication group to discuss and communicate in real time. All kinds of advertisements are prohibited in the forum. Please register as a registered user to check our usage and privacy policy. Thank you for your cooperation.

    TheHackerWorld Official

C语言——数据类型

 Share


NedK7

Recommended Posts

 

数据类型

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

Link to post
Link to comment
Share on other sites

 Share

discussion group

discussion group

    You don't have permission to chat.
    • Recently Browsing   0 members

      • No registered users viewing this page.
    ×
    ×
    • Create New...