开发者社区> 华章计算机> 正文

《编写高质量代码:改善c程序代码的125个建议》——建议14-3:移位的数量必须大于等于0且小于操作数的位数

简介:
+关注继续查看

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第2章,建议14-3,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议14-3:移位的数量必须大于等于0且小于操作数的位数

如果被移位的操作数的长度为n,那么移位的数量必须大于等于0且小于n。因此,在一次单独的操作中不可能将所有的位从变量中移出。例如,一个int型的整数是32位,并且n是一个int型整数,那么n << 31和n << 0是合法的,但n << 32和n << -1是不合法的。因此,我们在进行移位运算的时候必须做相关测试。示例代码如下所示:

unsigned int x;
unsigned int y;
unsigned int result;
/*初始x,y,result*/
if(y>=sizeof(unsigned int) * CHAR_BIT)
{
    // 错误处理
}
else
{
    result=x>>y;
}

这里还需要说明的是,对于变量x与y,C99规定:
对于x<2y可以用结果类型表示,那么这个表达式就是结果值,否则,其行为是未定义的;如果x是无符号类型,则x<2y,是根据“结果类型可以表达的最大值加1”进行求模运算得到的结果。需要注意的是,尽管在C99中指定了无符号整数的取模行为,无符号整数溢出还是常常导致出乎意料的值以及因此产生的潜在安全风险。
对于x>>y,如果x是无符号类型或非负值的有符号类型,那么x>>y的移位结果为 x/2y的商的整数部分;如果x是有符号类型的负值,那么x>>y的移位结果是由编译器所定义的。因此,对一个带符号整数进行右移运算和将它除以2的某次幂不一定是等价的。要证明这一点很容易,考虑(-1) >> 1的值,它的执行结果不可能为0,而在大多数C语言编译器中(-1)/2的结果都是0。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一句代码实现批量数据绑定“.NET技术”[下篇]
  《上篇》主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化。接下来,我们主要来谈谈DataBinder的设计,看看它是如何做到将作为数据源实体的属性值绑定到界面对应的控件上的。
621 0
C# String 前面不足位数补零的方法
在 C# 中可以对字符串使用 PadLeft 和 PadRight 进行轻松地补位。 PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddingChar 补足 totalWidth 长度 PadLeft(int totalWidth, char paddingChar) //在字符串右边用 paddingChar 补足
1560 0
linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】
转自:http://blog.csdn.net/gongweijiao/article/details/8207333 原文参见:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201215115845553/    一)概述   .堆栈是一个用户空间的内存区域,进程使用堆栈作为临时存储。
854 0
【高质量代码】如何写出更高质量的C/C++代码(2):函数设计
函数是组成C/C++程序的基本元素,是将一段执行某项功能的代码进行了封装的代码段。为了实现设计的功能,函数的功能正确性是首要的前提,但是仅仅是正确还不够,其设计的科学性和合理性也是影响函数使用的重要因素。
860 0
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
45 0
一句“.NET技术”代码实现批量数据绑定[下篇]
  《上篇》主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化。接下来,我们主要来谈谈DataBinder的设计,看看它是如何做到将作为数据源实体的属性值绑定到界面对应的控件上的。
625 0
Java工程师该如何编写高效代码?
阿里妹导读:世界上只有两种物质:高效率和低效率;世界上只有两种人:高效率的人和低效率的人。——萧伯纳 同理,世界上只有两种代码:高效代码和低效代码;世界上只有两种人:编写高效代码的人和编写低效代码的人。如何编写高效代码,是每个研发团队都面临的一个重大问题。 本文作者根据实际经验,查阅了大量资料,总结了"Java高效代码50例",让每一个Java程序员都能编写出"高效代码"。
7704 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载