C89中unsigned char与signed char互转是否有明确定义?申请重开问题
解答
1. signed char转unsigned char:结果有标准保证
根据C89标准,有符号整数类型转换为无符号整数类型时,结果为该值加上/减去无符号类型最大值加1的整数倍,直到结果落在无符号类型的取值范围内。
对于unsigned char,C89要求CHAR_BIT(字符的位数)至少为8,因此其取值范围至少是0到255。signed char的-2转换时,计算为-2 + 256 = 254,这个结果是标准强制保证的,和有符号数的内部表示(补码/反码/原码)无关。
2. unsigned char转signed char:结果依赖具体实现
C89标准规定:若无符号值在有符号类型的取值范围内,直接保留原值;若超出范围,结果由实现定义。
对于8位的unsigned char值254,当signed char为8位时:
- 若编译器采用补码表示(绝大多数主流编译器的实现),254对应的有符号值为-2;
- 若采用反码表示,结果为-1;
- 若采用原码表示,结果为-126。
C89并未强制要求有符号数必须使用补码,因此从标准层面,这个转换的结果没有统一保证,属于实现定义行为。不过现实中几乎所有C89编译器都使用补码,所以实际运行中大概率得到-2,但标准上不做强制约束。
内容的提问来源于stack exchange,提问作者Lone Learner
相关产品推荐
相关产品推荐

