大厂面试题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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen_captial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值