【发布时间】:2012-05-06 05:15:44
【问题描述】:
ctype.h 中的各种 is... 函数(例如 isalpha、isdigit)并非完全可预测。它们采用int 参数,但期望在unsigned char 范围内的字符值,因此在char 被签名的平台上,直接传递char 值可能会导致不需要的符号扩展。我相信处理这个问题的典型方法是首先明确地转换为unsigned char。
好的,但是处理wctype.h 中的各种isw... 函数的正确、可移植的方法是什么? wchar_t 和char 一样,也可以是有符号或无符号的,但因为wchar_t 本身就是一个typedef,所以unsigned wchar_t 的类型名是非法的。
【问题讨论】:
-
为什么符号扩展是个问题?
-
@Mat:
is...函数需要在unsigned char范围内的值。如果你给它们一个不同的值,你会得到未定义的行为。一个具体的例子是,如果你的字符值恰好是-1,它很可能会被视为EOF。 -
好点,我从来没有意识到他们是这样指定的。
-
@JaimeOlivares:嗯?如果您将
0xFF存储在签名的char中,那么当它被提升为例如32 位int时,它将变为0xFFFFFFFF。 -
@JaimeOlivares: 否。
char可能已签名或未签名,具体取决于平台。
标签: c language-lawyer ctype