Some essential problems in C

Here are some points that you may often meet when using c language. They are not difficult but they are error-prone. These issues are collected from my job interview and I am willing to share with you. 


[1] 字节对齐问题
[2] 原码与补码问题。
[3] switch语句问题。
[4] 位运算问题。
[5] 宏定义问题。
[6] 二维数组问题。
[7] 计算字符串长度问题。
[8] 大小端表示与字节序问题。
[9] 溢出问题。


[1] 字节对齐问题。在32位系统下,用VC6默认输出的结果如下:

 

[题目扩展]
自己设定字节对齐,方法如下:

  

[2] 原码与补码问题。

 

[分析]
此题主要考查负数在内存中是按补码形式存放的。
chr=127, chr+1: 1000 0000, 最高位为1说明是负数,那么求原码,方法减一取反得: 1000 0000, 所以表示-128, 那么sum=sum+chr=200+(-128)=72


[题目扩展] // 此题目有问题!
若码值FFH是一个整数的原码表示,则该整数的真值为多少?

[分析]
若在32位系统中用int类型(4B)保存此整数,则该整数的真值为0000 .... 0000 1111 1111=255
若用1B有符号类型变量来保存此整数,则次数在内存中为:1111 1111,说明为负数,那么求原码,方法减一取反得:0000 0001,那么其真值为-1 

[3] switch语句问题。

 

 [分析]
了解switch语句的执行流程,在写代码的时候,要养成在每一个case分支语句末尾添加break语句。

[4] 位运算问题。

[分析]
要熟悉左/右移运算符,左移等价于*2,而右移等价于/2

[5] 宏定义问题。

[分析]
考查宏展开,语句(float)(DIV(ivar1*ivar2,ivar1-ivar2) / 2)相当于如下:

(float)( ivar1*ivar2/ivar1-ivar2/2 );即,(float)(7*5/7-5/2)=(float)(5-2)=3.0

[6] 二维数组问题。

设计select函数:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。

[题目扩展] 

 

[7] 计算字符串长度问题。

 

[8] 大小端表示与字节序问题。

[分析]
一般intel系列的CPU是采用的Little-Endian的格式存放数据,即低位字节放在内存的低地址端

[9] 溢出问题。

   


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值