关于数据存储的三道面试题,你会吗?

关于数据存储的三道面试题,你会吗?

在这里插入图片描述


每博一文案

想要活得自在,快乐就要学会简单做人,淡然处事人活一世,
草木一秋,不必时时与别人真上游行简单,人就自然没有忧愁,
何必总让烦恼踩下眉头,却上筋头人参,就像一叶扁舟,
装得越少才能越自在飘游。
我们总是爱追逐虚无缥缈的自由,以为所谓的成功就是什么都能拥有,
却总在追逐的过程中迷失了方向,忘记了真正重要的是精神的富有
其实幸福与否,从来不靠财富衡量,心里装了太多欲望,总会
有累的时候。
浮华转瞬皆成空,千金一德,一个好的心态全难求
一种米养百种人,自然会有人让你快乐。
有人让你难受,遇事宽容,别对他人有太多要求,少计较别人的对与错
多关注自身的得与失,宽容,才能看见生活不一样的美,坦然 
面对那些是与非不值得关注的,别放在心上。
神念不满百,昌华千岁忧,已经过去的,何必执着还会到来的
何必担忧,总是左顾右盼,怎么能往前走,坦然面对一切,
管它什么烦恼忧愁,我自窥然不动,自在风流。
                                    ————————————     一禅心灵庙语


话不多说,上菜

开胃菜

请问下面的 strlen 的结果输出是多少 ???

#include<stdio.h>
#include<string.h>

int main()
{
	unsigned char arr[1000];
	int i = 0;
	for (i = 0; i < 1000; i++)
	{
		arr[i] = -1 - i;
	}
	printf("strlen: %d\n", strlen(arr)); 
	return 0;
}

解析:

  • 首先我们需要知道 strlen() 该函数的作用:

    • 作用就是:计算字符串的长度,结束的标志是:(‘\0’) 分隔符,计算到

      该分隔符,就停止了

    • 注意: ‘\0’ == 0 注意它们之间的关系:是相等的 ,’\0’ 其实就是数值 0 ,不过它是用来在字符中表示的 0 ,注意区别

    • 所以这里我们就可以得出一个strlen()结束的条件 就是 当arr[i] = 0 的时候

  • 明白char的范围和的图示表示

    在这里插入图片描述


运行验证:

在这里插入图片描述


中胃菜

  • 下面代码显示的 结果:
#include<stdio.h>

int main()
{
	int i = -20;
	unsigned int j = 10;

	printf("i+j = %d\n ", i + j);
	printf("i+j = %u\n", i + j);

	return 0;
}

解析:

  • 首先我们明白,数值的 是与我们定义的类型 (int , unsigned,char) 无关的,而是与它本身的类型 (正负) 有关的,数值是以 二进制补码的形式 存放到内存当中去的, 是与我们定义的了类型 (int,unsigned,char) 有关:1. 在内存中取数值补码的范围 —— 是否存在截断 2. 看类型是有无符号 (unsigned ,signed) ,有符号:则补码转反码,再转原码显示; 无符号 : 则补码=反码=原码,直接显示

  • 数值以补码存放在内存中,我们同样使用的是 它们之间的 补码相加 :

  • 原码 补码的方式:原码 ——> 符号位不变,按位取反 反码,——> 反码 +1, 补码

  • 补码 原码的方式:和原码转补码的方式一样:补码——> 符号位不变,按位取反 反码,——>反码 +1 , 原码

在这里插入图片描述

  • 一般有符号位的和无符号位的计算 ——结果会整形提升至 无符号的

]


运行验证:

在这里插入图片描述


结胃菜

  • 下面的代码存在这什么问题 ?
  • 运行的结果是什么呢 ?

#include<stdio.h>
#include<windows.h>

int main()
{
	unsigned int i = 0;
	for (i = 0; i >= 0; i--)
	{
		printf("%u\n", i);
		printf("%d\n", i);

		Sleep(1000); // 暂停 1s
	}

	return 0;
}

解析:

  • 首先我们可以发现一点:unsigned int i = 0i 是一个无符号类型的,从上一题 中胃菜 中我们已经知道了,数值的 与我们自定义的类型(int unsigned)是无关的,而数值的 是才与 我们自定义的类型(int unsigned)有关的,
  • 这里是的 i 是无符号的 unsigned 的,以无符号的形式取出 i 并与 0 比较判断,其结果是 永远大于等于 0 的 ,因为:无符号是不存在 负值 的,符号位会被当作是数值加入计算显示
  • 所以无法退出循环 形成:无限循环
    在这里插入图片描述

运行验证:

在这里插入图片描述


举一反三

  • 请看下面代码的结果是 ?
#include<stdio.h>
#include<windows.h>


int main()
{
	unsigned int i = 0;
	for (i = 9; i >= 0; i--)
	{
		printf("%d\n", i);
		printf("%u\n", i);

		Sleep(1000); // 暂停 1s
	}

	return 0;
}

解析:

  • 同样是 无符号的 出, i 是无符号的 unsigned 的,以无符号的形式取出 i 并与 0 比较判断,其结果是 永远大于等于 0 的 ,因为:无符号是不存在 负值 的,符号位会被当作是数值加入计算显示
  • 不过这里是从 9 开始减的

在这里插入图片描述

  • 无法退出循环 形成:无限循环

运行验证:

在这里插入图片描述

最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵 —— 多多益善,谢谢大家,后会有期,江湖再见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值