从'int'转换为'unsigned char'可能会改变其值

mal*_*lat 1 c gcc casting

如果gcc -Wconversion没有显式(=丑陋)强制转换,您将如何删除以下代码生成的警告:

int main()
{
  int val;
  unsigned char c1 = (val % 65536) / 256;
  unsigned char c2 = (val % 65536) % 256;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉编译器显然演员是在(% 65536) / 256或期间隐含地完成的% 256

以供参考

$ gcc -Wconversion w.c
w.c: In function ‘main’:
w.c:4:36: warning: conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
w.c:5:36: warning: conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
Run Code Online (Sandbox Code Playgroud)

tru*_*cks 6

使用静态强制转换(或将结果转换为unsigned char)

int main()
{
    int val;
    unsigned char c1 = (unsigned char)((val % 65536) / 256);
    unsigned char c2 = (unsigned char)(val % 256);
}
Run Code Online (Sandbox Code Playgroud)

这将切断警告,因为它基本上告诉编译器,"等等,我打算这样做".

如果您打算不使用签名的VALUES,那么应该从以下开始:

unsigned int val;
Run Code Online (Sandbox Code Playgroud)

代替:

int val;
Run Code Online (Sandbox Code Playgroud)

即使这样做,您也需要从unsigned int转换为unsigned char,因为编译器最终仍然认为您并不意味着按照您的方式进行下转换.

  • @janisz - 我很乐意接受有关你如何相信在某些时候没有演员表的情况下会这样做的建议.事实上,C是一种相当强类型的语言,因此,如果你要从更高的位宽数字移动到更小的数字,那么就需要进行转换. (3认同)
  • "没有一个丑陋的演员:" (2认同)