2013-08-31 56 views
1

gcc的-Wconversion警告,它看起来像字符和短裤被隐式转换为整数。short/char上的'〜'运算符隐式转换为int(C/gcc)

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

提供了以下警告,

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

+3

“但是如果在类型已经匹配的地方添加了演员,这有点奇怪。” - 他们不匹配。正如您所说的那样,在执行操作之前,这些值会隐式转换为int(如标准所要求的那样),并且此时类型不再匹配。由于类型不匹配,我没有看到你已经找到的解决方案的问题(添加一个演员)。 – hvd

+0

编辑问题,注意**变量**类型已经匹配。显然应用操作员后他们不。 – ideasman42

+0

请注意,您可以施放以安静警告,并且我检查了'gcc'至少不会在有/没有演员时更改汇编器输出。 – ideasman42

回答

7

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