short / char上的’〜’运算符隐式转换为int(C / gcc)

使用gcc的-Wconversion警告,看起来chars和short被隐式转换为int。

 #include #pragma GCC diagnostic warn "-Wconversion" void main(void) { short i = 1; short j = 1; short k = j & ~i; printf("value %d\n", j); } 

给出以下警告,

 test.c: In function 'main': test.c:9:15: warning: conversion to 'short int' from 'int' may alter its value [-Wconversion] short k = j & ~i; ^ 

回到短暂的静止警告short k = j & (short)~i; 但是在变量类型已经匹配的情况下添加强制转换有点奇怪。

我调查了是否进一步和(unsigned short)~(unsigned short)0导致0xffff
~(unsigned short)0结果为0xffffffff

任何人都可以推荐一个处理这些警告的好方法吗?
除了禁用-Wconversion

根据C标准(6.5.3.3) , 整数提升~的操作数上执行,结果是提升类型。 整数提升(6.3.1.1)基本上说小于int所有整数类型都被提升为int (如果int可以表示原始类型的所有值)或unsigned int (否则)。