cgcccasting

conversion to ‘unsigned char’ from ‘int’ may alter its value


How would you remove the warning produced by gcc -Wconversion on the following code, without an explicit (=ugly) cast:

int main()
{
  int val;
  unsigned char c1 = (val % 65536) / 256;
  unsigned char c2 = (val % 65536) % 256;
}

Is there a way to tell the compiler that obviously the cast is implicitely done during (% 65536) / 256 or % 256

For reference

$ 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]

Solution

  • Sounds like you want these results :

    c1 = (val >> 8) & 0xff;
    c2 = val & 0xff;
    

    Edit :

    From gcc wiki : Wconversion

    Warn for implicit conversions that may alter a value. This includes conversions between real and integer, like abs (x) when x is double; conversions between signed and unsigned, like unsigned ui = -1; and conversions to smaller types, like sqrtf (M_PI). Do not warn for explicit casts like abs ((int) x) and ui = (unsigned) -1, or if the value is not changed by the conversion like in abs (2.0). Warnings about conversions between signed and unsigned integers can be disabled by using -Wno-sign-conversion. For C++, also warn for conversions between NULL and non-pointer types; confusing overload resolution for user-defined conversions; and conversions that will never use a type conversion operator: conversions to void, the same type, a base class or a reference to them. Warnings about conversions between signed and unsigned integers are disabled by default in C++ unless -Wsign-conversion is explicitly enabled.

    The warning won't happen if val is unsigned but you have to be sure about what you want to get for negative values.