zoukankan      html  css  js  c++  java
  • 尽量不要使用无符号类型

    《C专家编程》中对在使用有无符号数有以下三点建议:
    1.尽量不要在你的代码中使用无符号数,以免增加不必需要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,国债)而用它来表示数量。
    2.尽量使用像int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如-1被翻译为非常大的正数)。
    3.只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号或无符号数,这样就不必由编译器来选择结果的类型。

    举例:

    #include<iostream>
    using namespace std;
    
    int array[] = {1,2,3,4,5};
    #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
    
    int main(){
      int d = -1, x;
    
      if(d <= TOTAL_ELEMENTS)
        x = array[d+1];
      
      cout << x << endl;  //输出: 134514361, 而不是1!
    }

    TOTAL_ELEMENTS所定义的值是unsigned int 类型(因为sizeof()的返回值是无符号数),if语句在signed int 和 unsigned int 之间测试相等性,所以d被升级为unsigned int 类型, -1转换成unsigned int 的结果将是一个非常巨大的正整数,所以if 表达式为假,x没有定义。输出结果并不是1。

    解决办法: 将TOTAL_ELEMENTS 进行强制类型转换。

    if (d <= (int) TOTAL_ELEMENTS)

    #---------------------------------------------------------------------------------#

    参考文献

    《C专家编程》, Peter Van Der Linden 著, 徐波 译  

  • 相关阅读:
    django2.0+连接mysql数据库迁移时候报错
    微信小程序路由跳转
    洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm
    洛谷P3143 [USACO16OPEN]钻石收藏家Diamond Collector
    洛谷P2677 超级书架 2
    洛谷P2676 超级书架
    洛谷P3146 [USACO16OPEN]248
    洛谷P1396 营救
    洛谷P1772 [ZJOI2006]物流运输
    P3102 [USACO14FEB]秘密代码Secret Code
  • 原文地址:https://www.cnblogs.com/dfcao/p/expertCprogramming_chap1_1-10.html
Copyright © 2011-2022 走看看