持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
一、大小端字节序
==这里将会解答倒着存储的问题==
1、什么是大端小端
==大端(存储)模式,是指将数据的高字节内容放到内存的低地址处。而数据的低字节内容放到内存的高地址处==
==小端(存储)模式,是指将数据的高字节内容放到内存的高地址处。而数据的低字节内容放到内存的低地址处==
2、为什么会有大端小端
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着1个字节,1个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型、int型(要看具体编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
3、实例
1、百度2015年系统工程师笔试题
==请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序(10分)== ==概念就不说了,上面有的==
#include<stdio.h>
int check_sys()
{
int a = 1;
char* p = (char*) &a;
return *p;//返回1表示小端,返回0表示大端
}
int main()
{
int ret = check_sys();
if(1 == ret)
printf("小端\n");
else
printf("大端\n");
return 0;
}
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;
}
结果: a=-1, b=-1, c=255 分析: -----------------------------------a-----------------------------------
-----------------------------------b----------------------------------- 同a -----------------------------------c-----------------------------------
-----------------------------------------分割线-------------------------------------------------------------------------- 补充: 1、char是signed char还是unsigned char。C语言并没有规定,取决于编译器(大多数编译器下是signed char) 2、int、short是signed是C语言规定的
3、输出什么?
#include<stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
结果: 4294967168 分析:
4、输出什么?
#include<stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
结果: 4294967168 分析:
5、char类型变量的取值范围(敲黑板)
==根据3、4题,同志们应该有许多疑问。比如char a能存储128吗?==
==signed char:==
==所以这里128不能被完全的放进去,而会发生截断,从而变成-127==
==unsigned char==
6、输出什么?
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
结果: -10 分析:
7、输出什么?
#include<stdio.h>
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
结果:
分析: i是个无符号类型的,也就是i只能>=0,所以这个循环的条件就恒成立
8、输出什么?
#include<stdio.h>
int main()
{
char a[1000];
int i;
for(i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
结果: 255 分析: -1 -2 -3 ... -127 -128 127 126 125 ... 3 2 1 0 -1 -2.. 在此过程中不断的 -1 - i 在循环结束后使用strlen去计算字符串长度时中途会碰到 \0 导致出现了255的结果
==超出范围的数据如果是正数,则减去256;如果是负数,则加上256==
补充:
9、输出什么?
#include<stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0; i <= 255; i++)
{
printf("hello bit\n");
}
return 0;
}
结果: 死循环 分析: 对于无符号的char类型的取值范围是0 ~ 255。而当i == 255时,再往后加,又会变成0。所以这个循环的条件就恒成立