その本はひどく間違っています。未定義の動作はありません
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。