C专家编程—使用unsigned int可能产生的Bug(1)
在vs2008环境下,如下代码显示不同的结果:
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main(void)
{
int d = -1;
if(d <TOTAL_ELEMENTS-2)
printf("success/n");
else
printf("failed/n");
return 0;
}
结果显示failed,而将if(d <TOTAL_ELEMENTS-2)改成if(d <(int)TOTAL_ELEMENTS-2),结果显示的是success。
C专家编程对此分析的原因是:TOTAL_ELEMENTS所定义的值是unsigned int 类型(因为sizeof()的返回类型是无符号数)。if语句在signed int和unsigned int之间测试相等性,所以d被升级为unsigned int类型,-1转换成unsigned int的结果将是一个非常巨大的正整数,致使表达式的值为假。要修正这个问题,只有对TOTAL_ELEMENTS进行强制类型转换即可。
启发:一、尽量不要再你的代码中使用无符号类型,以免增加不必要的复杂性。
二、尽量使用像int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如-1被翻译为非常大的数)。
三、只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或无符号数,这样就不必由编译器来选择结果的类型了。
C专家编程—使用unsigned int可能产生的Bug(1)相关推荐
- 【编程】char unsigned int float double long 字节数
定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4.char为字符型,用 ...
- 一篇特别长的总结(C专家编程)
博客链接: http://codeshold.me/2017/02/expert_c_programming.html 读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了 ...
- C专家编程 模块化与有限机编写cdecl声明程序
自己编写cdecl: //char * const *(*next)();示例 //结果:identifier is(标识符是)next //指向next的指针函数返回指向const的指针指向char ...
- C专家编程(Expert C Programming)1
C专家编程(Expert C Programming) 一基本概念 1.与时间相关的几个函数 char *ctime( const time_t *timer ); Each of these fun ...
- C专家编程 精编之一
C专家编程 精编之一 第一章~第三章 C的复杂之处 在于它的指针 ,但是比其指针更为复杂的是它的声明 !!! 你能看懂它们的意思 吗? apple=sizeof(int)*p ; ap ...
- C专家编程 读书笔记
在ANSI C中,如果要声明空参数表,则必须使用关键字void进行显式声明: CPU,16位地址总线,能够访问2^16也就是64KB的内存:20位地址总线,可以访问2^20也就是1MB的内存:32位地 ...
- C语言专家编程题,一篇特别长的总结(C专家编程)
读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了,但整理笔记却断断续续的花了三天时间,这从侧面更说明了这本书的经典了(尽管不到300页)! 至此C经典著作<C T ...
- C专家编程-读书笔记(书本顺序)
C语言设计哲学: 一切工作程序员自己负责. 语言中的所有特性都不需要隐式的运行时支持. 程序员所做的都是对的. 程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...
- 笹山希 java,c语言中unsigned int
C语言的unsigned int是什么意思? - 百度知道 最佳答案: C语言中unsigned int是无符号整数的意思. 无符号整型(unsigned int): (1)我们都知道整型是4个字节( ...
最新文章
- 谈谈服务雪崩、降级与熔断
- JobTracker节点后台线程之RetireJobs
- 深入理解signed、unsigned 关键字
- 方差分析的MATLAB实现(单因子)
- 剑指offer-有序二维数组中的查找
- Linux系统管理技术手册——第6章 添加新用户
- CentOS VS Ubuntu,谁才是更好的 Linux 版本?
- html跑马灯可以上下动ma,使用 JS 实现上下滚动走马灯
- springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池
- python大文件排序_python实现按创建时间对文件排序
- Http请求返回结果报UnsupportedCharsetException
- FISCO BCOS 区块链 学习开发步骤
- mysql sql loader_Sql Loader的简单使用
- Visual Studio快速配置增加文件版权声明
- java网络学习之 jca 常用引擎类简单介绍(13)
- 如何辩证看待技术与业务的关系
- wireshark-filter帮助手册
- MyBatis-plus执行自定义SQL
- 基础30讲 第九讲 一元函数积分学的几何应用
- 数学归纳法的5种常用形式——证明题的利器
热门文章
- redis make编译失败的原因
- Linux 的进程状态
- 常用UI模板,loading框,提醒框,弹框确认框
- Python __dict__和vars()
- Unity手游之路九自动寻路Navmesh之高级主题
- Django1.7学习(二)
- 从一个C程序学“逐步求精”的分析方法
- Windows Server中企业证书服务的安装
- [Python图像处理] 二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效
- 1.2 Hive的优缺点