El operador '~' en short / char implícitamente convierte a int (C / gcc)

Con gcc's-Wconversion advertencia, parece que los caracteres y los cortos se convierten implícitamente a ints.

#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);
}

Da la siguiente advertencia,

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;
               ^

Volviendo a un breve silencio la advertenciashort k = j & (short)~i; pero esto es un poco extraño agregando conversiones donde los tipos de variables ya coinciden.

Miré en si más y(unsigned short)~(unsigned short)0 resultados en0xffff.
Donde como~(unsigned short)0 resultados en0xffffffff

¿Alguien puede recomendar una buena manera de lidiar con estas advertencias?
Además de deshabilitar-Wconversion.

Respuestas a la pregunta(1)

Su respuesta a la pregunta