RL78CS+ forCCでソフトを作っています。例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。メインで、 uint16_t aa; uint16_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb);でコンパイルします。引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。暗黙の型変換だと思います。このような場合でもワーニングを出すことはできますか?
IKUZOさん
> 65534をuint32_tでは変わらず0xFFFFであれば0xFFFFFFFFとなって不安ではありますが
私が勘違いしているのでなければ勘違いされてるような気がします。
0xFFFFをuin32_tでキャストしても値は保持されるので、0xFFFFのままですね。
(-1)をuin32_tでキャストしたときは0xFFFFFFFFになるので、これと勘違いされてるのかと。
以下gccでの結果です。
$ cat test3.c #include <stdio.h>#include <stdint.h> int main(void) { uint16_t u16_m1 = (uint16_t)-1; uint32_t u32_cast = u16_m1; uint32_t u32_m1 = (uint32_t)-1; printf("0x%x: 0x%x: 0x%x\n", u16_m1, u32_cast, u32_m1); } $ gcc test3.c $ ./a.out 0xffff: 0xffff: 0xffffffff $
IKUZOさん、
> uint16_tをuint32_tに変換する等とは
> 0x7FFFをuint32_tでは変わらず0xFFFFであれば0xFFFFFFFFとなって不安ではありますが
uint16_t の値を uint32_t への変換では上位 16bit にゼロ拡張されるだけなので値に変化は生じません。
Wandboxで実行
符号ありの値をよりサイズの大きな符号なしの型に変換した場合には仰られてるような符号拡張が行われるため注意が必要となります。
> 値によってはFFFFとか4桁になったりするので
C99 以降の仕様であれば printf の第1引数に長さ修飾子 hh を指定することで引数が char であることを明示できます。
#include <stdio.h> int main(void) { char b = 0xff; printf("%02X\n",b); printf("%02hhX\n",b); }
FFFFFFFF FF