1.类型
整形型有:cha int short long
其中char虽然是字符类型,但字符类型存储的时候存的是字符的ascii码值,是整数。
signed char c1//不一定等价于short signed short c1//有符号的 等价于short /...
unsigned char c2 unsigned short c2//无符号的 /..
如果是有符号的数据,最高位是符号位。0是正数,1是负数。
char大部分编译器默认为正数。
浮点型:flout doublle
构造类型:数组类型、构造体类型、枚举类型、联合类型。
指针类型:int* char* flout* void* /..
空类型: void
2.整型在内存中的存储
2.1原码、反码、补码
正整数三码相同。对于整型而言内存中存储的是补码
int a=10 原码 00000000 00000000 00000000 00001010
反码 00000000 00000000 00000000 00001010
补码 00000000 00000000 00000000 00001010
b=-10 原码 10000000 00000000 00000000 00001010
反码 11111111 11111111 11111111 11110101 符号位不变,其他位按位取反
补码 11111111 11111111 11111111 11110110 反码+1
16进制中 1111 代表f 所以b的地址0xff ff ff f6(内存中是大端存储)
2.2数据范围
有符号char数据大小范围(-128~127) 无符号(0~255)
有符号short数据大小范围(-32768~32767)无符号(0~65535)
//...
%u ->按照无符号数打印,不是无符号数也认为是无符号数
%d-> 按照有符号数打印。
3.大小端存储
int a=0x11223343;
高位 低位
大端存储:把高位字节处的数据放在低地址处,把低位字节处放在高地址处
小端存储:把低位字节处的数据放在低地址处,把高位字节处放在高地址处
低地址 | 高地址 |
大端:11 22 | 33 43 |
小端:43 33 | 22 11 |
VS系统中用的是小端存储
char*类型指针只能访问一个字节,如果1是小端存储,访问的字节刚好是01,*p如果是1就表明是小端存储
int check_sys()
{
int a=1;
return *(char*)&a;
}
整型提升
-1的原码 10000000 00000000 00000000 00000001
补码为 11111111 11111111 11111111 11111111
由于a为char类型 所以存的是 11111111
a发生整型提升 补符号位得到补码为 11111111 11111111 11111111 11111111
整型提升后 补码变原码为 -1
unsigned char b=-1;
b存的是1111 1111
无符号数整型提升补0
b为 00000000 00000000 00000000 11111111
按照有符号数打印原码和补码一样 为255
int main()
{
char a=-1;
//-1的原码 10000000 00000000 00000000 00000001
//补码为 11111111 11111111 11111111 11111111
//由于a为char类型 所以存的是 11111111
//a发生整型提升 补符号位得到补码为 11111111 11111111 11111111 11111111
//整型提升后 补码变原码为 -1
unsigned char b=-1;
//b存的是1111 1111
//无符号数整型提升补0
//b为 00000000 00000000 00000000 11111111
//按照有符号数打印原码和补码一样 为255
printf("a=%d,b=%d",a,b);
//当打印a时,a不够一个整型 发生整型提升
return 0;
}
截断
char a =128; // 00000000 00000000 00000000 10000000
//存不下发生截断 存的是1000 0000
//整型提升 由于char是有符号数 11111111 11111111 11111111 1000 0000
//按照%u打印 认为没有符号位 是一个大数
printf("%u ",a);
例题
int main()
{
char a[1000];
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d ",strlen(a));
//统计\0之前出现多少个字符
return 0;
}
理论上字符串里面存的是-1到-1000
但char的范围为(-128~127)
达到-128时,再减1由于char类型发生截断被解析变成了127
所以存到的是-1、-2...-128、127、126...2、1。
所以有255个数