电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
粉丝问答一|关于计算机补码和结构体的两个问题
分 享
扫描二维码分享
粉丝问答一|关于计算机补码和结构体的两个问题
计算机基础
嵌入式软件
嵌入式与Linux那些事
关注
发布时间: 2021-06-03
丨
阅读: 250
> 哈喽,大家好。今天分享下,粉丝针对嵌入式软件开发面试知识点总结中的内容提出的两个问题。问题不难,但是容易掉坑里。而在笔试中,很多大厂都喜欢出这种题目来坑害小伙伴们。所以,大家在笔试前要扎实基础,做题的时候,要看清题目。 ## 问题一 ### 为什么-n=~ (n-1)=~ n+1? ### 解答 该问题来源于嵌入式软件开发面试知识点总结P141。原问题为:不用除法操作符如何实现两个正整数的除法。 粉丝的疑问在于表达式-n=~ (n-1)=~ n+1 。解决这个问题的核心在于,要知道**计算机中是如何存储数值**的。 在计算机系统中,数值一律用**补码**来表示(存储)。主要原因是**使用补码可以将符号位和其他位统一处理**;同时,减法也可以按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 **如何求补码呢?** 1. 正数的补码 与原码相同。 +9的补码是00001001。 2. 负数的补码 对其原码逐位**取反**,但符号位除外;然后整个数**加1**。 -7的原码为10000111,按位取反为11111000,加1可得11111001。所以-7的补码是11111001。 > 补码表示方式有很多,以上两个例子都是使用8位的2进制来表示的。此外,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。 **如何快速求补码?** 从最低位开始至找到的第一个1均不变,符号位不变,这之间的各位“求反”(0变1;1变0)。 原码:1010 1001 补码:1101 0111。 **举例** 下面,我们举个例子验证下上面的等式。假设n = 10,则可以得到下面的各个表达式。 ```c n:10 = 00001010 -n:-10 = 11110110 n-1:9 = 00001001 ~(n-1):-10 = 11110110 ~n:-11 = 11110101 ~n+1 = 11110110 ``` **代码验证** 算的对不对呢?可以写个代码验证下。 ```c #include
#include
int PrintBinary(int bi,int len){ int i=0; while(i
常用的位运算技巧 > > 1. -n=~ (n-1)=~ n+1 > > 2. 获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)。例如,n=010100,则-n=101100,n&(-n)= 000100。 > > 3. 去掉整数n的二进制中最后一个1:n&(n-1),如n=010100,n-1=010011,n&(n-1)=010000。 ## 问题二 ### 结构体所占字节数 该问题来源于嵌入式软件开发面试知识点总结P150。原问题为:指针进行强制类型转换后与地址进行加法运算,结果是什么? ```C struct BBB { long num; char *name; short int data; char ha; short ba[5]; }*p; ``` 在32位机器下, sizeof(struct BBB)=24。但是粉丝算的是28。 ### 解答 | | char | 指针变量 | short int | int | unsigned int | float | double | long | long long | unsigned long | | ---- | :--: | :------: | :-------: | :--: | :----------: | :---: | :----: | :---: | :-------: | :-----------: | | 32位 | 1 | **4** | 2 | 4 | 4 | 4 | 8 | **4** | 8 | **4** | | 64位 | 1 | **8** | 2 | 4 | 4 | 4 | 8 | **8** | 8 | **8** | 这位粉丝估计是把数据类型所占字节数记错了。 对于32位系统:4+4+2+1+(1)+10+(2)=24 对于64位系统:8+8+2+1+(1)+10+(2)=32 > 括号中的数字,表示的是为了保证4字节对齐需要填充的字节数。 ## 总结 粉丝的提问,在我能力范围内的,我都会回答。有时候,问题不一定能够及时看到。但是,群里大佬也不少,一般都会有人解答的。因此,我鼓励大家把问题发到交流群里。大家可以互相学习,互相交流。 ![](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E4%BA%94%E6%9C%88//20210512112438.png) ![](https://img-blog.csdnimg.cn/img_convert/b34b214d9204ea5c63ee119cce8c42e4.png) ![](https://img-blog.csdnimg.cn/20210501171528470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2OTMzNjAx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/20210501171554514.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2OTMzNjAx,size_16,color_FFFFFF,t_70) ![](https://img-blog.csdnimg.cn/img_convert/3849456abcb91c73901a0419541280d4.png) ![](https://img-blog.csdnimg.cn/img_convert/f807e00a6581c51a6eac7ccb451520d0.png) ![](https://img-blog.csdnimg.cn/img_convert/307c523e6333ea0a41a6275f92a7eb01.png) 扫描下方二维码关注我的公众号【**嵌入式与Linux那些事**】 送你**2000G学习资料包**! ![](https://gitee.com/dongxingbo/Picture/raw/master//Wechat/Article/2021/%E4%B8%89%E6%9C%88/20210323231124.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式与Linux那些事
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交