了解C中的格式说明符

时间:2011-08-22 10:05:49

标签: c

如何解释:

int main()
{
unsigned char z=-1;
printf("%u %d",z,z);
}

给出255 255?

4 个答案:

答案 0 :(得分:3)

这不是说明者,而是关于类型 - 它是unsigned。由于[0;255]unsigned char的范围是标准的(unsigned xxx)-1,意味着 - 给出无符号xxx类型的最大值。


您的代码:

unsigned char z=-1;

具有隐式转换,它与

相同
unsigned char z= (unsigned char)-1;

所以,z == 255

答案 1 :(得分:2)

是,因为255是z的值。 As you can find here

%u将输出无符号整数值,和
%d将输出整数值

值255表示与unsigned int和integer相同,因此您将看到255两次。

答案 2 :(得分:0)

您已将z声明为unsigned char,然后将其设置为-1。因此,当您将其打印出来时,由-1设置的位模式显示为无符号值255.请使用谷歌进行二次补充。

答案 3 :(得分:0)

因为-1的二进制位模式(二进制补码)是1111 1111,而zunsigned类型。 unsigned 1111 1111类型255implicit conversion

修改

这是从有符号整数-1到无符号字符的6.3.1.3,它由6.3.1.3 Signed and unsigned integers中的C语言本身定义。

256(UCHAR_MAX+1) + (-1) = 255

  

1当整数类型的值转换为_Bool以外的另一个整数类型时,   如果值可以由新类型表示,则不会更改。

     

2否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内。

您的案例非常适合 2nd 案例,unsigned char,并且它保持在{{1}}的范围内。