Advertisement

有符号数和无符号数一起做运算的坑

阅读量:

今天做道LeetCode的简单题踩到坑了。

LeetCode传送门

我一开始写的代码是

复制代码
    class Solution {
    public:
    int countGoodSubstrings(string s) {
        int ans=0;
        for(int i=0;i<s.length()-2;i++){
            if(s[i]!=s[i+1]&&s[i]!=s[i+2]&&s[i+1]!=s[i+2])
                ans++;
        }
        return ans;
    }
    };
    
    
      
      
      
      
      
      
      
      
      
      
      
    

结果发现s的长度为1时程序也能进入循环,按理说没理由。

后来发现是string.length()函数返回值的坑,它的返回值是size_t类型,在64位系统中为long long unsigned int,非64位系统中为long unsigned int,也就是说是无符号整数

因为在一个算数表达式中既有无符号数又有有符号数,那个有符号数就会变成无符号数。

所以当s长度为1,s.length()-2就相当于1加上-2转换成的无符号数,而-2的补码符号位为1,相当于是一个很大的无符号数,所以s.length()-2最终得到的将是一个很大的无符号整数。

而i为0,显然0小于很大的无符号整数,条件成立,会进入循环。(判断小于的汇编意义其实是做减法,而有符号数和无符号数做减法,会先将有符号数转换为无符号数。)

所以把s.length()转成int先,如下:

复制代码
    class Solution {
    public:
    int countGoodSubstrings(string s) {
        int ans=0;
        for(int i=0;i<(int)s.length()-2;i++){
            if(s[i]!=s[i+1]&&s[i]!=s[i+2]&&s[i+1]!=s[i+2])
                ans++;
        }
        return ans;
    }
    };
    
    
      
      
      
      
      
      
      
      
      
      
      
    

全部评论 (0)

还没有任何评论哟~