C语言数据类型

数据类型

计算机数据存储

**原码:**原码表示法在数值前面前面有一位符号位(即最高位为符号位),正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

**反码:**正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外

**补码:**计算机用反码计算时存在-0问题,所以诞生了补码

补码计算:正数和+0的补码是其原码;负数则先计算其反码,然后反码加上1,得到补码;补码减掉1,得到反码,再将反码取反,得到原码。

8位二进制取值范围是(-2^7)~(2^7-1),即-128~127。

由于补码=10000000具有特殊性,计算机在编写底层算法时,将其规定为该取值范围中的最小数-128,其值与(-1)+(-127)的计算结果正好符合。

8位二进制补码1000 0000没有对应的反码和原码,其他位数的二进制补码与此类似。

数据类型

字符和整形变量

数据类型的本质就是为了合理利用内存空间

字节:1B==8位b(二进制)

1b只能存放0或1

1
2
3
4
5
6
7
8
9
10
11
12
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
test01();

system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9

void test01()
{
char ch;
printf("sizeof (ch)=%d\n", sizeof(ch));//1字节

int num;
printf("sizeof(num)=d%\n", sizeof(num));//4字节
}

指针变量

硬盘——内存——CPU

内存是CPU和硬盘的桥梁

内存地址:内存编号,内存中每一个字节分配一个号码,就是内存编号

指针变量:存放上面的号码

1
2
3
4
5
6
7
8
9
10
11
12
13
void test02()
{
int num = 100;
//取变量地址 用&
printf("%p\n", &num);//num变量空间4字节,取到的是变量num的起始地址,第一字节地址
//需求 定义一个指针变量保存num的地址
int *p=NULL;
//定义时:*说明p是指针变量 int *整体定义p是一个整数指针类型!
printf("sizeof(p)=%d\n", sizeof(p));
p = &num;//p指向了num变量空间的首地址,于是通过p可以找到num变量
printf("*p=%d\n", *p);
//使用中:*表示取p变量指向的地址空间的内容(间接地取到变量num的值)
}

编译结果:

1
2
3
4
00AFFCE4
sizeof(p)=4
*p=100
请按任意键继续. . .

test03

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void test03() 
{
int num = 10;
int *p = NULL;
//指针变量的两种类型:自身类型 指向类型
//自身类型:在指针变量定义的时候,除去变量名剩下的就是该指针变量的的类型
//指针变量p自身类型就是int *
//指向类型:在指针变量定义时,除去*p剩下的就是该指针变量合法的指向类型
//指针变量p的指向类型就是int,所以只能合法地指向int类型的变量
//指向类型决定了 指针变量所取空间内容的宽度 决定了指针变量+1跳过的
p = &num;
//指针变量的跨度
printf("&num=%u\n", &num);
printf("p=%u\n", p);
printf("p+1=%u\n", p + 1);
printf("*p=%d\n", *p);

char *p1 = &num;
printf("p1=%u\n", p1);
printf("p1+1=%u\n", p1 + 1);
}

编译结果:

1
2
3
4
5
6
7
&num=16448116
p=16448116
p+1=16448120
*p=10
p1=16448116
p1+1=16448117
请按任意键继续. . .

testmy01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
testmy01() 
{
int num = 1021;
int *p = NULL;
p = &num;
printf("&num=%u\n", &num);
printf("p=%u\n", p);
printf("*p=%d\n", *p);

char *p1 = &num;//p1步长是一个字节

printf("p1=%u\n", p1);
printf("*p1=%d\n", *p1);

p1 += 1;
printf("p1=%u\n", p1);
printf("*p1=%d\n", *p1);

p1 += 1;
printf("p1=%u\n", p1);
printf("*p1=%d\n", *p1);

p1 += 1;
printf("p1=%u\n", p1);
printf("*p1=%d\n", *p1);
}

编译结果:

1
2
3
4
5
6
7
8
9
10
11
12
&num=5503868
p=5503868
*p=1021
p1=5503868
*p1=-3
p1=5503869
*p1=3
p1=5503870
*p1=0
p1=5503871
*p1=0
请按任意键继续. . .

我不李姐


test04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void test04() 
{
int num = 0x12020304;//赋值十六进制

int *p1 = &num;
printf("*p1=%#x\n", *p1);//输出十六进制

short *p2 = &num;
printf("*p2=%#x\n", *p2);

char *p3 = &num;
printf("*p3=%#x\n", *p3);

short *p4 = &num;
p4 += 1;
printf("*p4=%#x\n", *p4);
}

编译结果:

1
2
3
4
5
*p1=0x12020304
*p2=0x304
*p3=0x4
*p4=0x1202
请按任意键继续. . .