有符号数和无符号数一起做运算的坑
发布时间
阅读量:
阅读量
今天做道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)
还没有任何评论哟~
