为什么-1用这个上下文打印?(签名char vs unsigned char)

时间:2014-05-24 10:51:32

标签: c++

据我所知,它应该依赖于实现,但它返回-1。为什么?

char ch = 255;
int i = ch;
cout<<i;
return 0;

2 个答案:

答案 0 :(得分:4)

默认情况下,

char可以是已签名或未签名。 (依赖于实现)

签名字符的最小范围是-127到127(通常为-128到127)。

如果默认情况下char已签名,则ch将无法容纳255(0xFF)并将其静默转换为-1(0xFF)。然后将它类型转换为int并打印,因此输出为-1。

为避免这种情况,请明确使用unsigned char。 (范围至少为0到255)

4.7积分转换[conv.integral]

  

[3]如果目标类型已签名,则值可以保持不变   以目的地类型(和位字段宽度)表示;   否则,该值是实现定义的。

答案 1 :(得分:3)

char可能是(在您的情况下显然是)签名类型,范围从-128到+127。 因此char ch = 255会触发溢出,从而为签名类型生成实现定义结果。