大厂面试题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语言篇 《二》链表概述,增删改查等多功能实现及相关面试题(上)

数据结构c语言篇 《二》链表概述,增删改查等多功能实现及相关面试题(上)

500道全网最新python面试习题(大厂面试经典,从此面试不在愁)持续更新中(附源代码)

备战秋招冲击大厂Java面试题系列—JVM及垃圾回收机制