当您将两个整数值相加时,两个值都可以放入一个int中,它们将作为ints 相加。
如果您需要 aunsigned int来适应其中一个,则将它们添加为unsigned ints。
如果这些不够大,可以使用更大的类型。它变得复杂,如果我没记错的话,它会随着标准修订而改变(那里有一些粗糙的地方)。
现在,int如果溢出,与 s 的加法是未指定的。与unsigned ints 相加可以保证将 mod 包装成 2 的幂。
当您将 anint或 an转换unsigned int为有符号类型时,如果它不适合,则未指定结果。如果它适合,它适合。
如果将intor转换unsigned int为无符号类型,则结果可以表示为等于源 mod 的 2 的某个幂(对于给定的无符号类型固定)。
许多流行的 C++ 编译器和硬件返回与2s 补码逻辑解释时相同的位模式,但这不是标准所要求的int。unsigned int
因此L'A' + 1涉及将 L'A' 转换为int,添加1为int.
如果我们添加缺少的位:
wchar_t bob = L'A' + 1;
我们可以看到警告发生的位置。编译器看到有人将 a 转换int为 awchar_t并警告他们。(当所讨论的值不是编译时常量时,这更有意义)
如果我们明确表示:
wchar_t bob = static_cast<wchar_t>(L'A' + 1);
警告(可能?希望?)消失了。只要右手边的结果在有效值的范围内wchar_t,你就是黄金。
相反,如果您正在做:
wchar_t bob = static_cast<wchar_t>(L'A' + x);
哪里x是int, 如果wchar_t已签名,您可能会遇到麻烦(如果x足够大,则未指定结果!),如果它未签名,您仍然可能会有些惊讶。
这个static_cast方法的一个好处是,如果你不小心将指针输入(wchar_t)x到wchar_t(x)强制转换中,它就不会起作用。
请注意,强制转换xor1是相对没有意义的,除非它使编译器安静下来,因为值总是在操作int之前+(或unsigned ints ifwchar_t是无符号且与 a 大小相同)向上转换(逻辑上)转换为 s int。如果是无符号的,则int比这大得多wchar_t是相对无害wchar_t的,因为保证反向转换与在wchar_tmod 中添加其 2 的幂相同,并且如果wchar_t有符号,则离开色域无论如何都会给出未指定的结果。
因此,使用static_cast. 如果这不起作用,请使用位掩码明确清除您不关心的位。
最后,VS2013 对int. 所以static_cast<wchar_t>(L'A' + x)并且总是产生相同的值,如果用or替换static_cast<wchar_t>( L'A' + static_cast<wchar_t>(x))就会这样做。wchar_tunsigned shortsigned short
这是一个糟糕的答案:它需要管理和剔除。但我累了,这可能很有启发性。