这个问题源于以下建议:转换为 unsigned在调用诸如 std::toupper 和 std::tolower 之类的字符操作函数之前, char 是必需的。然而,Bjarne Stroustrup 的代码似乎在不进行强制转换的情况下使用这些函数。
Char 表示
Char、signed char 和 unsigned char 是 C 中的不同类型。 Char 可以表示相当于有符号字符或无符号字符的范围。在 char 带符号的系统中,整个字符集都具有非负值。
toupper 函数
根据 C 标准,toupper 接受 int 参数并返回一个 int 结果。输入值必须可表示为无符号字符或等于 EOF。如果不是,则行为未定义。
未定义行为
如果普通 char 有符号并且传递给 toupper 的值为负数,则会发生未定义行为。这是因为隐式转换为 int 会产生负值。
转换为 Unsigned Char
将 char 参数转换为 unsigned char 可确保该值为非负数,避免未定义的行为。尽管 char 和 unsigned char 具有相同的大小,但它们代表不同的值范围。
实现
这些函数通常使用查找表来实现。超出表范围的索引可能会导致未定义的行为。如果结果隐式转换回负值,直接转换为 unsigned char 并不能避免此问题。
Exception: EOF
C 修改
C 标准仅修改某些 C 标准库函数,并且功能上没有任何调整
结论
为了避免未定义的行为,有必要在调用 toupper、tolower 或类似函数之前将 char 参数强制转换为 unsigned char函数,即使 char 是非负符号类型。
以上是在使用'toupper()”、'tolower()”等之前我应该转换为'unsigned char”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!