汎整数拡張
一方、上記(2)の代入式では、まず右辺式++ucにおいて、unsigned char型のオブジェクトであるucに前置インクリメント演算子が付いているから、以下のようにucに1を加算した値をucに代入するという計算が行なわれる。
上記における単純代入演算子=の右オペランドには先程と同じように汎整数拡張が適用されて、ucの評価結果255はint型に変換され、そしてuc + 1の演算結果はint型の256となる。その後、int型の256をunsigned char型のucに代入する演算が行なわれる。しかしこのとき、unsigned char型では256を表現することはできないので、int型の256を、unsigned char型に格下げする変換が行なわれることになる。
今回の変換では、前述の「格下げ」項に示した《「符号付き→符号無し」であり、かつaが正の数である場合》の規則である
が適用される。ここで、aは256、T_MAXはunsigned char型の最大値つまりUCHAR_MAXで255となる。これらの値を上記の公式に代入してみると、
となり、256を256で割った余りは0になるので、最終的にsi2に代入される値は0になる。つまり、情報の欠落が発生することになる。
上記において、unsigned char型の値はすべてint型で表現可能であることから、先程示した汎整数拡張の規則が適用され、式uc1 * uc2におけるuc1とuc2の評価結果は、いったんint型に格上げされる。つまり、uc1 * uc2は暗黙的に(int)uc1 * (int)uc2とみなされる。
同様に、-(uc1 * uc2) / (uc3 - uc4)は暗黙的に-((int)uc1 * (int)uc2) / ((int)uc3 - (int)uc4)とみなされる。
別の例を示す。
上記(1)の代入式では、まず右辺式uc + 1において、unsigned char型のオブジェクトであるucに、int型のリテラルである1を加算する演算を行なう。このとき、先程と同じように汎整数拡張が適用され、ucの評価結果は、いったんint型に格上げされる。この処理系ではchar型が8ビットであると仮定すれば、UCHAR_MAXの値は255になる。そしてこのとき、ucの評価結果である255はunsigned char型ではなくint型である。ゆえに、uc + 1の演算結果はint型の255 + 1すなわち256となり、si1に代入される値は256である。