その本はひどく間違っています。未定義の動作はありません
signed char c = 256;
256
型の整数リテラルですint
。これで a を初期化するには、 (§8.5 [dcl.init]/17.8; すべての参照は N4140 へ) にsigned char
変換されます。signed char
この変換は、§4.7 [conv.integral] によって管理されます。
1 整数型の prvalue は、別の整数型の prvalue に変換できます。スコープのない列挙型の prvalue は、整数型の prvalue に変換できます。
2 宛先タイプが署名されていない場合、[...]
3 宛先タイプが符号付きの場合、宛先タイプ (およびビットフィールド幅) で表現できる場合、値は変更されません。
それ以外の場合、値は実装定義です。
256 を表すことができない場合signed char
、変換によって type の実装定義の値が生成されsigned char
、それが初期化に使用されますc
。ここには未定義のものはありません。
「符号付きオーバーフローは UB である」と人々が言うとき、彼らは通常、§5 [expr]/p4 のルールを参照しています。
式の評価中に、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合、動作は未定義です。
これにより、UB 式が次のようにレンダリングINT_MAX + 1
されます。オペランドは両方ともint
であるため、結果の型もint
ですが、値は表現可能な値の範囲外です。このルールはここでは適用されません。唯一の式は256
であり、その型はint
であり、256 は明らかに の表現可能な値の範囲内にありますint
。