Clang-Tidy use of a signed integer operand with a binary bitwise operator

Colder丶 2018-05-08 04:24:19


我在CLion上用C实现了一个顺序表,在扩容的时候,我选择扩容为原来的1.5倍,如图代码所示,我用位移操作的时候编译器会报一个警告,这警告百度不到,谷歌出来的更是看不懂。。还请大神们点拨下谢谢!
...全文
2720 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 2021-01-07
  • 打赏
  • 举报
回复
敢于用clang的猿,都具有做律师的资质,赞一个。
Silence~123 2021-01-07
  • 打赏
  • 举报
回复
size改成 unsigned p->size >> 1u 这样可以
Gameparkwing 2019-05-26
  • 打赏
  • 举报
回复
Clang-Tidy 静态检查比较严谨,位操作必须使用无符号数,包括常量。 在 pl->size >> 1 当中,光 pl->size 是 unsigned 还不够, 1 必须也是。 所以,改成 pl->size >> 1u ,就不会有警告提示了。
自信男孩 2018-05-08
  • 打赏
  • 举报
回复
引用 4 楼 SinY_Chan 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 SinY_Chan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量,若将size编程无符号变量试一下。有符号整型编程无符号整型。
刚试过了,改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned,用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题?[/quote] 那建议不使用移位操作,而采用除法,即p->size/2 + 1;[/quote] 嗯呢我现在改成这种写法了,因为我觉得用位移操作会更快嘛。。所以就这么写了,但是自我感觉没啥问题却给我了警告,就有所疑问。。还是多谢你[/quote] 也可以先强制类型转换一下再移位。
(unsigned int)(p->size) >> 1
赵4老师 2018-05-08
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
unsigned short int ui;
  signed short int si;
int main() {
	ui=(unsigned short int)0x8000u;
	si=(  signed short int)0x8000;
	printf("ui=%u\n",ui);
	printf("si=%d\n",si);
	ui=ui>>1;
	si=si>>1;
	printf("ui=%u\n",ui);
	printf("si=%d\n",si);

	printf("--------------\n");
	ui=(unsigned short int)0x8000u;
	si=(  signed short int)0x8000;
	printf("ui=%u\n",ui);
	printf("si=%d\n",si);
	ui=((  signed short	int)ui)>>1;
	si=((unsigned short	int)si)>>1;
	printf("ui=%u\n",ui);
	printf("si=%d\n",si);

	return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384
Colder丶 2018-05-08
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
[quote=引用 2 楼 SinY_Chan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量,若将size编程无符号变量试一下。有符号整型编程无符号整型。
刚试过了,改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned,用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题?[/quote] 那建议不使用移位操作,而采用除法,即p->size/2 + 1;[/quote] 嗯呢我现在改成这种写法了,因为我觉得用位移操作会更快嘛。。所以就这么写了,但是自我感觉没啥问题却给我了警告,就有所疑问。。还是多谢你
自信男孩 2018-05-08
  • 打赏
  • 举报
回复
引用 2 楼 SinY_Chan 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量,若将size编程无符号变量试一下。有符号整型编程无符号整型。
刚试过了,改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned,用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题?[/quote] 那建议不使用移位操作,而采用除法,即p->size/2 + 1;
Colder丶 2018-05-08
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
这个警告是是对有符号数做按位操作。size应该是有符号变量,若将size编程无符号变量试一下。有符号整型编程无符号整型。
刚试过了,改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned,用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题?
自信男孩 2018-05-08
  • 打赏
  • 举报
回复
这个警告是是对有符号数做按位操作。size应该是有符号变量,若将size编程无符号变量试一下。有符号整型编程无符号整型。

70,029

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧