RL78CS+ forCCでソフトを作っています。例えば、関数 void xxfunc(uint32_t, uint32_t) があったとします。メインで、 uint16_t aa; uint16_t bb; aa = 1000; bb = 6000; xxfunc(aa, bb);でコンパイルします。引数の型が合わないのでワーニングが出ると思いましたが出ませんでいた。暗黙の型変換だと思います。このような場合でもワーニングを出すことはできますか?
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
>「uint8_tとint16_tの掛算や割算などの演算を無事に行う書き方はありますか?」
C言語ではint同士の演算でもオーバーフローや 0除算をさせないことはプログラマの責任になります。assert() をまめに用いる等でそれを検出することも不可能ではありませんが自動でそれを行う方法は通常用意されていません。
C Swift Rust