一.大小端字节序判断
1.什么是大小端?
大端(储存)模式:
将低字节位储存到高地址处
小端(储存)模式:
降低字节位储存到低地址处
举例:
注意:在VS中为小端存储模式,其他机器的可能不同
二.练习
1.1 写一个函数判断该机器的字节序
代码:
#include <stdio.h>
int cheak_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int a = 1;
int ret = cheak_sys();
if (ret == 1)
printf("小端");
else
printf("大端");
return 0;
}
运行结果和解释:
1.2
代码:
#include <stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a = %d, b = %d, c = %d", a, b, c);
return 0;
}
结果和解释:
补充:
1.3
代码:
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
结果和解释:
1.4
代码:
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
结果和解释:
1.5
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000];
int i;
for(i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
结果和解释:
1.6
代码1:
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
代码2:
#include <stdio.h>
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
return 0;
}
结果和解释:
死循环,unsigned char的范围为0~255,始终跳不出循环
1.7
代码:
#include <stdio.h>
//X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结果是啥?
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
printf("%p\n", p + 0x1);//
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
结果和解释:
1.8
代码:
#include <stdio.h>
//X86
环境
⼩端字节序
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;
}
结果和解释:
注意:
X64程序可能会崩溃
原因:
(int)a 在 x64 下可能导致地址截断(int 通常 32 位,而指针 64 位)。
如果 a 的地址是 0x00007FFD12345678,强制转 int 会丢弃高 32 位,变成 `0x12345678`。
(int)a + 1 = 0x12345679。
再转回 int* 时,可能变成 `0x0000000012345679`(高 32 位清零),访问非法地址(导致崩溃或未定义行为)。
三.浮点数在内存中的储存
1.
补充:1E10代表1*10^10
举例:
2.
补充:
举例:
3.
练习:
代码:
#include <stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:% d\n", n);
printf("*pFloat的值为:% f\n", *pFloat);
*pFloat = 9.0f;
printf("n的值为:% d\n", n);
printf("*pFloat的值为:% f\n", *pFloat);
return 0;
}