When compiling encoding.c from the screen-v4 branch: encoding.c: In function ‘AddUtf8’: display.h:322:18: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘c >> 12 & 12288^ 248’ to ‘-8’ [-Woverflow] 322 | *D_obufp++ = (c); \ | ^ encoding.c:682:4: note: in expansion of macro ‘AddChar’ 682 | AddChar((c & 0x3000000) >> 12 ^ 0xf8); | ^~~~~~~ encoding.c: In function ‘ToUtf8’: encoding.c:727:13: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘c >> 12 & 12288^ 248’ to ‘-8’ [-Woverflow] 727 | *p++ = (c & 0x3000000) >> 12 ^ 0xf8; | ^
Indeed, the code is really strange: (c & 0x3000000) >> 12 ^ 0xf8 will be stored in a char. So why dealing with bits more significant than the 8 bits of a char? The master branch has a similar code, but with int replaced by uint32_t, so that the warning disappears just because of the unsigned type (the behavior becomes fully specified by the C standard instead of being implementation defined). -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)