一.整数在内存中的存储


二.大小端字节序和字节序判断

cpp
int main()
{
int a = 10;//0x 00 00 00 0a
int b = 0x11223344;
return 0;
}




1.检测大小端代码

cpp
//写一个代码,来判断当前机器是大端还是小端?
int main()
{
int a = 1;
char* p = (char*)& a;
if (*p == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
int main()
{
int a = 1;
if (*(char*)&a == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
int check_sys()
{
int a = 1;
//1. 取出a的地址
//2. 强制类型转换成char*后解引用,只取a的第一个字节的数据
//3. 如果取出是1,就是小端,取出是0就是大端
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}

2.练习二
cpp
#include <stdio.h>
int main()
{
char a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111
//存储在a中要发生截断
//11111111 - a
//11111111111111111111111111111111
//10000000000000000000000000000000
//10000000000000000000000000000001
//
signed char b = -1;
//11111111 - b
//
unsigned char c = -1;
//11111111 - c
//00000000000000000000000011111111
//
printf("a=%d,b=%d,c=%d", a, b, c);
//-1 -1 255
//%d - 十进制的形式打印有符号的整数
//
return 0;
}


整型提升按照我们的有无符号位进行提升

3.练习三
cpp
#include <stdio.h>
int main()
{
char a = -128;
//10000000000000000000000010000000
//11111111111111111111111101111111
//11111111111111111111111110000000
//10000000 - a
//打印时发生整型提升
//11111111111111111111111110000000
//
printf("%u\n", a);//4,294,967,168
//%u 是十进制的形式打印无符号的整数
//
return 0;
}


cpp
#include <stdio.h>
int main()
{
char a = 128;
//00000000000000000000000010000000
//10000000 - a
//
printf("%u\n", a);
return 0;
}
这个结果和上面的是一样的

4.练习四
cpp
int main()
{
char a[1000];
//-128~127
//-1 -2 -3 ... -128 127 126 125 ... 5 4 3 2 1 0 -1 -2 ... -128 127 126 ... 5 4 3 2 1
//128+127 = 255
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));//求字符串长度找的是\0,\0的ASCII码值是0,其实找的就是0
//255
return 0;
}
5.练习五
cpp
#include <stdio.h>
unsigned char i = 0;
//0~255
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
会死循环,这里unsigned char 最大255
6.练习六
cpp
#include <stdio.h>
#include <windows.h>
int main()
{
unsigned int i;
//死循环
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
Sleep(1000);//睡眠1秒
}
return 0;
}
和上面是一样的,也会死循环
7.练习七
cpp
#include <stdio.h>
int main()
{
int a[4] = { 1, 2, 3, 4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}


%x是以16进制进行打印
三.浮点数在内存中的存储

1.练习
cpp
#include <stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;//int*
printf("n的值为: %d\n", n);
printf("*pFloat的值为: %f\n", *pFloat);
*pFloat = 9.0;
printf("num的值为: %d\n", n);
printf("*pFloat的值为: %f\n", *pFloat);
return 0;
}


2.浮点数的存储


cpp
10: 5.5
2: 101.1
科学计数法:1.011 * 2^2
(-1)^0 *1.011 *2^2
S = 0
E = 2
M = 1.011








回到刚刚那个题目
cpp
#include <stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;//int*
printf("n的值为: %d\n", n);
printf("*pFloat的值为: %f\n", *pFloat);
*pFloat = 9.0;
printf("num的值为: %d\n", n);
printf("*pFloat的值为: %f\n", *pFloat);
return 0;
}





cpp
int main()
{
float f = 99.7f;
printf("%f\n", f);
return 0;
}

