-Wshift-count-overflow 大数赋值警告处理

先上参考链接:

c++ - shift count overflow when doing 1<<40 - Stack Overflow

描述基本与我编译出的警告一致,直接看解决方法:

-Wshift-count-overflow 大数赋值警告处理

只是这个是常数的,我的是这样子的:

    

	ret = (data[7] | (data[6] << 8) | (data[5] << 16) | (data[4] << 24) | (data[3] << 32) | (data[2] << 40) | (data[1] << 48) | (data[0] << 56));

 ret是一个unsigned long long int类型,这样执行赋值,结果没问题,但是会出标题的警告,根据上面的参考链接,这边稍作修改,如下,即解决:

 ret = (data[7]) | ((u64)(data[6] << 8)) | ((data[5] << 16)) | ((data[4] << 24)) | ((u64)data[3] << 32) | ((u64)data[2] << 40) | ((u64)data[1] << 48) | ((u64)data[0] << 56);

原因大概猜的,有可能不对,希望有知道的来个正解,谢谢!

原因大概是这样:因为当一个unsigned char要偏移56位时,与偏移24位的不一样,编译器默认支持的扩展是unsigned int(u32),如果是要扩展临时值到unsigned long long int(u64)的话,需要自己指定,不然就会出warning。

所以只要在超32位的位移时,才去做u64强制扩展即可去掉warning。

上一篇:695. 岛屿的最大面积


下一篇:32. 最长有效括号