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

ide*_*n42 1 c casting

随着gcc的-Wconversion警告,看起来chars和short被隐式转换为int.

#include<stdio.h>

#pragma GCC diagnostic warn "-Wconversion"

void main(void)
{
    short i = 1;
    short j = 1;
    short k = j & ~i;
    printf("value %d\n", j);
}
Run Code Online (Sandbox Code Playgroud)

给出以下警告,

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;
               ^
Run Code Online (Sandbox Code Playgroud)

回到一个简短的静音警告,short k = j & (short)~i;但这有点奇怪添加变量类型已经匹配的强制转换.

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

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

nic*_*kie 7

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