CLASS1 基本数据类型:
1.数据类型:固定内存大小的别名。是创建变量的模子。用于声明变量(4个字节大小的数据类型为int )
Char:一个字节
Short:两个字节
Int:四个字节
2.变量:一段实际连续存储空间的名字。通过变量来申请并且命名存储空间。变量的内存取决于其所属的数据类型。(3000-3004的存储空间的名字为变量i)知道存储空间名字之后,便可方便使用指定的内存空间。
3.指针:也是变量,存储的是另一个变量的地址
4.变量与类型的区别:
Sizeof(i/int):得到变量/数据类型所占的内存大小
例1:
打印出来:4,4
例2:typedef定义数据类型的关键字:
#include <stdio.h> typedef int INT32;//INT32是新的数据类型,由int定义,即可代替int typedef unsigned char BYTE;//同理BYTE也是新的数据类型,由unsigned char定义 typedef struct _tag_ts//_tag_ts是啥不了解,等复习了结构体再更改。 { BYTE b1; INT32 i; short s; }TS;//TS代表上述结构体
int main() { INT32 i32; BYTE b32; TS ts;//声明ts变量为结构体 printf("%d,%d\n",sizeof(INT32),sizeof(i32)); printf("%d,%d\n",sizeof(BYTE),sizeof(b32)); printf("%d,%d\n",sizeof(TS),sizeof(ts)); getchar(); return ; } |
CLASS2有符号和无符号
符号位:数据类型的最高位,用于标识数据的符号。
最高位为1,数为负数
最高位为0,数为正数
练习:
#include<stdio.h> int main() { int sign=0; char i=-5;//char一个字节的内存,8位,数字二进制存储,-5记为11111001,规则看下一知识点 short j=5; int k=-1; sign=(i&0x80);//0x为十六进制,转化为二进制10000000,&按位与,即i为负数,则结果不为零,i为正数,结果为0 printf("%d",sign); getchar(); return 0; } |
结果: sign非零
有符号数在计算机内部用补码表示:正数的补码是本身,负数补码是负数的各位取反后加1。
例2,表示7或-7:
7->111->00000111
-7->11111000+1->11111001
无符号数在计算机内部用原码表示,因为默认为正数,没有符号位。
无符号数最小为0。最大值受他所占的位数决定。
所以MAX_VALUE+1=MIN_VALUE或MIN=MAX-1
C语言中,变量默认为有符号数,unsigned声明变量为无符号数,signed表示有符号数。
只有整数类型(int,short,long)能够声明unsigned变量,浮点数不行。
#include<stdio.h> int main() { int i;//默认为带符号整形 unsigned int j;//声明变量为无符号整形 signed int k;//声明变量为有符号整形 return 0; } |
例:求结果
#include<stdio.h> int main() { unsigned int i=5; int j=-10; if((i+j)>0) { printf("i+j>0"); } else { printf("i+j>0"); } getchar(); return 0; } |
结果:!!!!!
无符号数和有符号数进行运算,有符号数自动转化为无符号数进行运算,结果为无符号数,一定大于零(-10为int(4字节,32位),转为32位2进制,同时负数首位为1,数字愈发大,为111111111。。。。。。。)
例:
#include<stdio.h> int main() { unsigned int i=0; for(i=9;i>=0;i--) { printf("%u\n",i); } } |
结果:无限个该些值
原因:无限:for的判断条件i>=0,无符号数最小值为0,无限满足条件。
为4294-----等数字,无符号数变为0后-1就变为最大值(最大值为4个字节(32位)的全1值)因为判断条件的设定,导致错误的使用了unsigned。因此需要慎重考虑有符号和无符号数。
CLASS3浮点数
浮点数在内存中的存储方式:符号位,指数,尾数,与int(整数)内存表示不同
|
符号位 |
指数 |
尾数 |
Float(4字节) |
1位 |
8位 |
23位 |
Double(8字节) |
1位 |
11位 |
52位(0-51) |
Float和double,分别表示不同的数值范围和精度
浮点数的转换:
- 浮点数转换为二进制
- 科学记数法表示二进制浮点数
- 计算指数偏移后的值
注意:计算指数时需要加上偏移量,
例:对于指数6,偏移后的值:
Float :127(固定值)+6——>133
Double:1023+6——1029
例:实数8.25在内存中的float表示:
8.25二进制表示:1000.01(0.25——4的-1次)科学记数法表示——>1.00001*(2^3),二进制,后退几个小数点,2的几次。得到指数3.
符号位:0(为正数)
指数:127+3——>130——>10000010(转成8位2进制)
小数00001
所以在内存中的存储为;
- 10000010 00001(全0补齐位数)
例:编程实验:10进制浮点数的内存表示
#include<stdio.h> int main() { float f=8.25; unsigned int * |