大厂面试题C语言的数据存储相关习题
Posted 敲键盘的钢琴家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大厂面试题C语言的数据存储相关习题相关的知识,希望对你有一定的参考价值。
大厂面试题C语言的数据存储相关习题
- 第一题、请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
先来了解什么叫做大小端:
1、大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
2、小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
方法1:
#include<stdio.h>
int check_sys()
{
int a=1;
retuen *(char*)&a;
}
int main()
{
int ret=check_sys();
if(1==ret)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
方法2:
#include<stdio.h>
int main()
{
union U
{
char c;
int i;
}u;
u.i=1;
if(u.c==1)
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
- 第二题、
//输出什么?
#include <stdio.h>
int main()
{
char a= -1;
//10000000000000000000000000000001-a原码
//11111111111111111111111111111110-a反码
//11111111111111111111111111111111-a补码
//11111111 -将a存放到char空间里要发生截断,a里面放的是截断的内容
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);//-1 -1 255
return 0;
}
解析:在当前编译器char==signedchar,虽然a,b,c里面放的都是11111111,以%d打印的时侯,以有符号整数打印,a,b,c都会发生整型提升;a整型提升得到11111111111111111111111111111111,转换为原码得10000000000000000000000000000001;b和a同理;关于c,无符号数整数提升高位补0,得到00000000000000000000000011111111,转换为原码得00000000000000000000000011111111(原、反、补相同)
- 第三题、
#include <stdio.h>
int main()
{
char a = -128;
//10000000000000000000000010000000-a原
//11111111111111111111111101111111-a反
//11111111111111111111111110000000-a补
//10000000-a存储的八个比特位
printf("%u\\n",a);
return 0;
}
解析:%u以无符号位的形式打印整数,发生整型提升,char a类型为有符号的,所以 发生整型提升得到11111111111111111111111110000000,再以无符号数打印,得到一个巨大的正值,即11111111111111111111111110000000二进制序列的值
- 第四题、
#include <stdio.h>
int main()
{
char a = 128;//-128到127
//00000000000000000000000010000000
//00000000000000000000000010000000
//00000000000000000000000010000000
//10000000
printf("%u\\n",a);
//11111111111111111111111110000000
return 0;
}
解析:a里面只能放八个比特位,范围-128到127,发生截断得到10000000,以%u无符号整型打印会发生整型提升,a是有符号的,以高位符号位1提升得到11111111111111111111111110000000
- 第五题、
int i= -20;
//10000000000000000000000000010100-i原
//11111111111111111111111111101011-i反
//11111111111111111111111111101100-i补
unsigned int j = 10;
//00000000000000000000000000001010-j补
printf("%d\\n", i+j);
//11111111111111111111111111101100-i补
//00000000000000000000000000001010-j补
//11111111111111111111111111110110-j+i补
//11111111111111111111111111110101-j+i-1
//10000000000000000000000000001010-j+i原码 -10
//按照补码的形式进行运算,最后格式化成为有符号整数
- 第六题、
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\\n",i);
//9 8 7 6 5 4 3 2 1 0 -1
}
解析:-1的二进制补码以11111111111111111111111111111111;,当以无符号整数打印的时候是一个非常大的整数。
- 第七题、
int main()
{
unsigned int n=-10;
//10000000000000000000000000001010
//11111111111111111111111111110101
//11111111111111111111111111110110
printf("%d",n);//-10
printf("%d",n);//4294967286
}
解析:以-10二进制补码的形式放入n中,但是对于不同的打印得到的结果不同,所以在使用的时候,类型一定要匹配起来。
- 第八题、
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
解析:这是一个字符数组,strlen计算长度遇到\\0停止,要想知道数值多少,关键是要找到在那个位置0被赋值给数组
- 第九题
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\\n");
//unsigned char范围0到255,所以恒成立,死循环
}
return 0;
}
以上是关于大厂面试题C语言的数据存储相关习题的主要内容,如果未能解决你的问题,请参考以下文章
金三银四 | 进军BATJ大厂必看的技术点/面试题总结Linux后台开发
数据结构c语言篇 《二》链表概述,增删改查等多功能实现及相关面试题(上)
数据结构c语言篇 《二》链表概述,增删改查等多功能实现及相关面试题(上)