我已经完成了C++入门第5版,现在我正在阅读Strostrup的C++编程原理和实践第2版。然而,在许多情况下,作者似乎依赖于一些UBs,比如这个:
int x = 2.9; char c = 1066;
这里,
x
将得到值2
而不是2.9
,因为x
是int
,而int
s的值不是整数的分数,只是整整数(显然(。类似地,如果我们使用公共ASCII字符集,c
将得到值42
(表示字符*
(,而不是1066
,因为在该字符集中没有值为1066
的char
。
但是char x = 1066;
溢出了signed char
,所以行为是未定义的,我不确定他在说什么:它产生*
,因为UB可以像我猜测的那样意味着任何东西,因此我们不依赖甚至不猜测结果。你觉得呢?非常感谢。
但是char x=1066;溢出了一个有符号的字符,因此行为是未定义的
这不是真的。
溢出是算术运算的结果。这里发生的是转换。将一个不可表示的整数转换为另一个整数类型不会有未定义的行为,即使该类型是有符号的。
p.S.char
不是signed char
。它们是不同的类型。它的实现定义了char
是有符号的还是无符号的。