在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)相关推荐

  1. 【编程】char unsigned int float double long 字节数

    定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4.char为字符型,用 ...

  2. 一篇特别长的总结(C专家编程)

    博客链接: http://codeshold.me/2017/02/expert_c_programming.html 读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了 ...

  3. C专家编程 模块化与有限机编写cdecl声明程序

    自己编写cdecl: //char * const *(*next)();示例 //结果:identifier is(标识符是)next //指向next的指针函数返回指向const的指针指向char ...

  4. C专家编程(Expert C Programming)1

    C专家编程(Expert C Programming) 一基本概念 1.与时间相关的几个函数 char *ctime( const time_t *timer ); Each of these fun ...

  5. C专家编程 精编之一

    C专家编程  精编之一     第一章~第三章 C的复杂之处 在于它的指针 ,但是比其指针更为复杂的是它的声明 !!! 你能看懂它们的意思 吗? apple=sizeof(int)*p  ;   ap ...

  6. C专家编程 读书笔记

    在ANSI C中,如果要声明空参数表,则必须使用关键字void进行显式声明: CPU,16位地址总线,能够访问2^16也就是64KB的内存:20位地址总线,可以访问2^20也就是1MB的内存:32位地 ...

  7. C语言专家编程题,一篇特别长的总结(C专家编程)

    读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了,但整理笔记却断断续续的花了三天时间,这从侧面更说明了这本书的经典了(尽管不到300页)! 至此C经典著作<C T ...

  8. C专家编程-读书笔记(书本顺序)

    C语言设计哲学:   一切工作程序员自己负责.   语言中的所有特性都不需要隐式的运行时支持.   程序员所做的都是对的.   程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...

  9. 笹山希 java,c语言中unsigned int

    C语言的unsigned int是什么意思? - 百度知道 最佳答案: C语言中unsigned int是无符号整数的意思. 无符号整型(unsigned int): (1)我们都知道整型是4个字节( ...

最新文章

  1. 谈谈服务雪崩、降级与熔断
  2. JobTracker节点后台线程之RetireJobs
  3. 深入理解signed、unsigned 关键字
  4. 方差分析的MATLAB实现(单因子)
  5. 剑指offer-有序二维数组中的查找
  6. Linux系统管理技术手册——第6章 添加新用户
  7. CentOS VS Ubuntu,谁才是更好的 Linux 版本?
  8. html跑马灯可以上下动ma,使用 JS 实现上下滚动走马灯
  9. springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池
  10. python大文件排序_python实现按创建时间对文件排序
  11. Http请求返回结果报UnsupportedCharsetException
  12. FISCO BCOS 区块链 学习开发步骤
  13. mysql sql loader_Sql Loader的简单使用
  14. Visual Studio快速配置增加文件版权声明
  15. java网络学习之 jca 常用引擎类简单介绍(13)
  16. 如何辩证看待技术与业务的关系
  17. wireshark-filter帮助手册
  18. MyBatis-plus执行自定义SQL
  19. 基础30讲 第九讲 一元函数积分学的几何应用
  20. 数学归纳法的5种常用形式——证明题的利器

热门文章

  1. redis make编译失败的原因
  2. Linux 的进程状态
  3. 常用UI模板,loading框,提醒框,弹框确认框
  4. Python __dict__和vars()
  5. Unity手游之路九自动寻路Navmesh之高级主题
  6. Django1.7学习(二)
  7. 从一个C程序学“逐步求精”的分析方法
  8. Windows Server中企业证书服务的安装
  9. [Python图像处理] 二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效
  10. 1.2 Hive的优缺点