类型意义:
1.类型决定内存空间大小(大小决定了使用范围)
2.如何看待内存空间的视角
类型分类
整形
类型 | 大小(字节) |
short | 2 |
int | 4 |
long | 4 |
long | 8 |
浮点型
类型 | 大小(字节) |
float | 4 |
double | 8 |
long double | 12 |
构造类型
数组 | |
结构性 | struct |
联合 | union |
枚举 | enum |
指针类型
空类型
void(表示空类型,无返回值)
原码、反码、补码
- 计算机中的整形有符号数表示方法为 原码,补码,反码.
- 均为符号位和数值位两部分,符号位都是用0表示"正",用1表示"负",首位为符号位
- 三种表示方法各不相同
- 无符号数 : 原码,反码,补码均相同.
- 计算机存储的是 补码(可以将符号位和数值域统一处理,加法和减法统一处理,因为cpu只有加法器), 反码=补码-1,原码=反码按位取反,特殊的补码 10000000,原码为 -128
- 无符号类型 unsigned 有符号 signed
原码:
直接将二进制转按照正负数的形式 换为二进制就可以
反码
原原码符号位不变,其他位依次按位取反即可
补码
反码+1即可·
比如 :
int a=20;// 4字节 32bit
原码: 00010100(8个数表示20, 前面再加24个0)
补码,反码与 原码相同
int b=-10;//4字节 32bit
原码: 0000 1010(8个数表示10,前面加23个0,最前面符号位为1)
反码: 1111 0101(前面加23个1,最前面符号位为1)
补码: 1111(等于15) 0110(反码+1)
转换16进制位(4个2进制位转换为1个16进制位) 补码转换16进制:0x ffffff6
大小端介绍
什么是大小端:
大端(存储): 指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储): 指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
低地址: 编号小的
高地址 : 编号大的
如 0x 11 22 33 44
地址: 由低到高
数据: 由高到低
44为数据低位 , 11为数据高位
44为内存高地址 , 11为内存低地址
大端存储:11 22 33 44(人为)
小端存储:44 33 22 11(计算机)
//判断当前字节序:
//思路: 内存以16进制存储,如果第一个字节为 相对应16进制数,就为小端存储 ,否则为大端.
//比如 int a =1; 16进制为 01 00 00 00 (小端)
//利用 char* 来 访问一个字节的内容,指针类型决定访问几个字节的数.
//代码如下:
int check()
{
int a=1;
return *(char* )&a;
// 取出a的地址,并把强制转换类型 为 char*(因为只需要访问字节),再解引用得到其中的数,并返回
}
int main()
{
//返回1,小端
//返回0,大端
int ret=check_sys();
if(ret==1)
{
printf("小端");
}
else
{
printf("大端");
}
}
例题1:
main()
{
//数都为 -1,没赋值前补码都一致
char a = -1;
//原码:10000000000000000000000000000001
//补码:11111111111111111111111111111111
//输出为int.整形提升(按符号位补高位)
//得补码:11111111111111111111111111111111(32)
//为负数,原码输出还是 -1
signed b = -1;
//和a同理
unsigned c = -1;
//补码:111111111111111111111111 11111111
//因为赋值类型为unsigned ,最高位为0,整形提升(按符号位补高位),
//得新补码:0000000000000000000000 11111111(32)
//此时为整数, 原反补码一致 为255
printf("%d %d %d", a, b, c);
}
例题2:
main()
{
//数都为 -1,没赋值前补码都一致
char a = -128;
//原码:100000000000000000000000 10000000
//补码:111111111111111111111111 10000000
//因为赋值类型为char.认为1为符号位(按符号位补高位)
//得新补码:111111111111111111111111 10000000(32)
//%u打印 打印十进制无符号数., 原反补码一致 为111111111111111111111111 10000000
printf("%u", a);
}
char 分析:
有符号 char范围 : -128------127
无符号 char范围: 0-------255
有符号字符类型范围图:
例题3:
main()
{
char a = 128;
printf("%u", a);
char b =- 128;
printf("%u", b);
//输出一致
// a存不了128, 可以表示为 127+1=-128
}
例题4:(无符号 与 有符号 计算)
int i=-20;
unsigned j=10;
printf("%d",i+j);
//-20的 补码
11111111 11111111 11111111 11101100
//10的 补码
000000 0000000 0000000 00001010
结果:
11111111 1111111 11111111 11111010 补码
11111111 1111111 11111111 11110110 反码
00000000 0000000 00000000 00001001 原码 -10
例题5: (-1 补码 与 无符号数)
unsigned int i;
for(i=9;i>=0;i--)
{
printf("%d",i)
}
//无限循环
//当循环到 -1 时,由于-1补码全为1, 赋值给i, i为 无符号数,修改最前面的1为0 ,将会变为一个超大的数.
例题6: (字符类型范围)
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
//参考上图 字符类型取值范围图,
//当-1,-2.....到-128是,下一个数 为127,126,125.....,知道0,停止存储.
//字符类型范围 -128到127
例题7:
unsigned char a[1000];
int i;
for(i=0;i<=255;i++)
{
printf("hello");
}
//无符号数 取值范围 0-255 , 当i为255+1 时, 将会变为 0,从而无限循环
浮点 类型:
基础知识:
不带任何后缀的浮点型变量 默认double , 以f(F).l(L) 分别表示 float 和 long double
float 表示 6个有效字符 , double 表示 15个 , long double 表示 18个.
浮点型 字面量,有且只有一个小数点,两侧至少一边有数字.
指数形式:
e(E)为底 为 十进制指数 如:2.87e-3 ,
以0x(0X)打头,p(P)分隔的 是以 2为底数的 16进制指数 如:0x2p3=16.0