数据类型
计算机数据存储
**原码:**原码表示法在数值前面前面有一位符号位(即最高位为符号位),正数该位为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));
int num; printf("sizeof(num)=d%\n", sizeof(num)); }
|
指针变量
硬盘——内存——CPU
内存是CPU和硬盘的桥梁
内存地址:内存编号,内存中每一个字节分配一个号码,就是内存编号
指针变量:存放上面的号码
1 2 3 4 5 6 7 8 9 10 11 12 13
| void test02() { int num = 100; printf("%p\n", &num); int *p=NULL; printf("sizeof(p)=%d\n", sizeof(p)); p = # printf("*p=%d\n", *p); }
|
编译结果:
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 = # printf("&num=%u\n", &num); printf("p=%u\n", p); printf("p+1=%u\n", p + 1); printf("*p=%d\n", *p);
char *p1 = # 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 = # printf("&num=%u\n", &num); printf("p=%u\n", p); printf("*p=%d\n", *p);
char *p1 = #//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 = # printf("*p1=%#x\n", *p1);
short *p2 = # printf("*p2=%#x\n", *p2);
char *p3 = # printf("*p3=%#x\n", *p3);
short *p4 = # p4 += 1; printf("*p4=%#x\n", *p4); }
|
编译结果:
1 2 3 4 5
| *p1=0x12020304 *p2=0x304 *p3=0x4 *p4=0x1202 请按任意键继续. . .
|