数据类型(基本类型)day2
三:数据类型
一:分类
1.整形:整数 浮点型:小数 字符型:处理符号数据"TOM"
2.常量形式:在程序运行过程中,其值不能被改变的量称为常量 变量形式:在程序运行过程中,其值能被改变的量称为常量
二:整型
1.常量:123//十进制 0x123//十六进制 0123//八进制
//八进制<=>二进制----(一位八进制数对应三位二进制数)8421BCD码 //十进制转二进制—辗转相除法(高位下,低位上) //十六进制<=>二进制—(一位十六进制数对应四位二进制数) 8421BCD码
2.变量:整形int
4字节 short
短整型2字节 long
长整型8字节 long long
长长整型8字节 本质开了一块内存空间
signed/unsigned
//有符号和无符号 八种 //不能用在浮点型 可用在整型和字符型
//不能数字开头 区分大小写 不能和二级关键词及系统函数重名 不能和C语言关键字重名
3.sizeof(xxx
) 看对应xxx的大小,int
就int
的内存大小 ,a就a所占的大小
4.字节序问题:0x12345678----小端—高高低低(高位数据放在高地址处) //高地址处指地址的名字大—eg:0x1004比0x1001大,所以0x1004是高地址处 高位数据–eg:0x12345678,在其中12是高位数据,78是低位数据
大端(51单片机,ARM系列{默认小端可设置大端}等)—高低高低(高位数据放在低地址处)
5.整形的具体存储方式
int a = 123
; 规则:整形数据—补码的方式存储
正整数:原码,补码,反码的值都是一样的
负整数:补码,反码 + 1
32位— 0000 0000 0000 0000 0000 0000 0000 0000 //数值位
有符号(最高位充当符号位.其余位充当数值位)-32768------32767(-215–215-1)符号位0正1负
32位— 0|000 0000 0000 0000 0000 0000 0000 0000
无符号(都充当数值位)0~65535(2^16-1)
eg:-123
原码:1|000 0000 0000 0000 0000 0000 0111 1011
反码:1|111 1111 1111 1111 1111 1111 1000 0100 //符号位不变,其他位 按位取反
补码:1|111 1111 1111 1111 1111 1111 1000 0101 //反码+1 //如果在对补码进行补码得出就是原码
f f f f f f 8 5
如果出现 1|000 0000 0000 0000 0000 0000 0000 0000
//-2^31:特殊–规定,这个值的最高位即充当符号位也充当数值位
6.整形数据的溢出
一个整型变量(int
)只能容纳-32768 - 32767 范围内的数,无法表示大于 32767 或小于-32768 的数。遇到此情况就发生”溢出”。但运行时并不报错。 它好像汽车里程表一样, 达到最大值以后,又从最小值开始计数。
三:浮点型
1.科学计数法1.234e3/1.234E-3
2.float
4字节 double
8字节 long double
3.float
符号位|指数位|(8位)|尾数位(23位)
0|000 0000 0| 000 0000 0000 0000 0000 0000
eg: step1:float f = 12.125; 整数部分:1100
0.125 * 2 = 0.25 -----0 / 025 * 2 = 0.5 -----0 / 0.5 * 2 = 1.0--------1 小数部分:0.001(乘2取整法)
step2:1100.001 = 1.100001 * 2^3 //科学计数法形式(二进制)
step3:按照IEEE 754 标准格式存储
符号位|指数位|(8位)|尾数位(23位)
0|000 0000 0| 000 0000 0000 0000 0000 0000
0 127+3 100001
0 1000 0010 100001 0 0000 0000 0000 0000 //不足补零
0100 0001 0100 0010 0000 0000 0000 0000
4 1 4 2 0 0 0 0
4.double
符号位|指数位|(11位)|尾数位(52位)
0| 1023 (2^(11-1)-1)|
5.浮点数的比较问题(精度不一致)
float f=0.9;
printf("sizeof(0.9) = %ld]n",sizeof(0.9));
if(f==0.9)//判断语句中 0.9被判断为double类型 不是float类型//主要原因是 0.9 用乘2取整法是循环的,float有23个尾数 而double有52个尾数 //所以f 和 0.9 相比, 0.9在系统识别势必f稍大一点的//if( f == 0.9f) 加上f就会让0.9强制位float类型
{
printf("yes\n");
}else
{
printfC"no\n");
}
解决:只用同一个数据类型,系统默认double
eg:123 整型常量默认识别为signed int
类型 123u为unsigned int
类型 也可以123uL unsigned long int
#include<stdio.h>
int main(int argc, const char *argv[])
{
#if 0 float f = -6.125;int *p = (int *)&f;printf("*p = %#x\n",*p);
#endifprintf("sizeof(0.9) = %ld\n",sizeof(0.9));printf("sizeof(0.9f) = %ld\n",sizeof(0.9f));printf("sizeof(0.9l) = %ld\n",sizeof(0.9l));printf("sizeof(0.9L) = %ld\n",sizeof(0.9L));printf("sizeof(123llu) = %ld\n",sizeof(123llu));return 0;
}
四:字符型
1.char ch
//sizeof(ch)
= 1;1字节
2.man ascii
0-32 不可见字符 数字字符 ‘0’~‘9’ 对应ASCII(48-57)
大写字母A-Z 65-90 小写字母a-z 97-122 空格字符 ’ ’ 是32
3.字符 互转 数值型数字
char ch1 = '3';printf("ch1 = %d\n",ch1 - '0');//打印数值数字char ch2 = 3;printf("ch2 = %c\n",ch2 + '0');//打印字符数字