1.数据的类型
整形
char short int long long
浮点型
float double
构造类型
数组 结构体 枚举类型 联合类型
指针
空类型
整形在内存中的存储
对于整形来说在计算机中存储的都是补码,将整形按照进制转换关系转换为二进制即为原码,注意负数的符号位是1正数的符号位是0,对于正数来说,反码补码均与原码相同,对于负数来说,原码的符号位不变,其余位按位取反即为反码,反码加一即为补码。
2.1大小端介绍
大端是指数据的高位保存在内存的低地址中,数据的低位保存在内存的高地址中。小端是指数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。
写一个可以判断当前机器字节序的代码
#include
int main(void)
{
int a = 1;//00000000 00000000 00000000 00000001 0x00 00 00 01
char* q = (char*)&a;//大端存储则为 00000001 小端存储则为 01000000
if (*q == 1)//对取出的一个字节进行判断 01则为小端存储 00则为大端存储
printf("小端");
else
printf("大端");
return 0;
}
2.2数据在内存中的存储相关练习题目
//输出什么?
#include
int main()
{
char a= -2;
signed char b=-2;
unsigned char c=-2;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
//-2的原码是10000000 00000000 00000000 00000010 反码是11111111 11111111 11111111 11111101 补码是 11111111 11111111 11111111 11111110
//因为char类型只占一个字节,则a中为11111110 b中为11111110 c中为11111110 a,b是有符号的则按照符号位补齐是 11111111 11111111 11111111 11111110
//将补码除符号位不变,其余位按位取反得到10000000 0000000 0000000 00000001 加一得到 10000000 00000000 00000000 00000010则a,b均为-2
//c是无符号的数,则前面补零为 00000000 00000000 00000000 11111110 (%d是以10进制的形式打印有符号的整数)则c是2+4+8+16+32+64+128=254
#include
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
//-128的补码是11111111 11111111 11111111 10000000 则a中为10000000 %u表示按unsigned int 格式输出输入数据
//则为11111111 11111111 11111111 10000000 无符号格式输出计算得到4294967168
#include
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
//128的补码是00000000 00000000 00000000 100000000 则在a中存储的是10000000 11111111 11111111 11111111 10000000
//以无符号格式输出输入则为4294967168
#include
int main(void)
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
//i的补码是11111111 11111111 11111111 11101100 j的补码是00000000 00000000 00000000 00001010
//i和j相加是11111111 11111111 11111111 11110110
//%d是以10进制的形式打印有符号整数 10000000 00000000 00000000 00001001 补码:10000000 00000000 00000000 00001010 其结果是-10
#include
int main(void)
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
}
//%u是以unsigned int 格式输入输出 当i是0时打印0,由于i是无符号整数当i减1,-1的补码是 11111111 11111111 11111111 11111111 由于没有符号位
//则将是一个很大的整数,往复循环,打印不会停止。假如我们将i的类型改为int 则屏幕上打印0到9这些数字
#include
#include
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
//一个有符号的char 内存中存储的是二进制的补码,其顺序为 00000000 01111111 10000000 10000001 11111111
//其值依次为0,1,2,3,...... 127 -128 -127 ......-1
//strlen 函数遇见\0停止计算\0的ascll码值是0,则经过255次遇见第一个\0
//则会打印255
#include
int main()
{
int j = 0;
unsigned char i = 0;
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
j += 1;
}
return 0;
}
//一个无符号的char,由于内存中存储的是二进制序列,则为 00000000 00000001 ....... 11111111 为从0到255
//一个char内不可能存储比255更大的数,所以该程序会死循环
3.浮点型在内存中的存储
float double long double 等等
根据国际标准754,任意一个二进制数可以表示为下面的形式:
(-1 )^S*M*2^E
(-1)^S表示符号位,S取零为正数,S取1为负数
M表示有效数字,大于等于1,小于2.
2^E表示指数位。
如十进制的3.75写成二进制是11.11 可以表示为(-1)^0*1.111*2^1
如十进制的-3.75写成二进制是-11.11可以表示为(-1)^1*1.11*2^1
对于32位的浮点数来说,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
对于64位的浮点数来说,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字