如何解释:
int main()
{
unsigned char z=-1;
printf("%u %d",z,z);
}
给出255 255?
答案 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
,而z
是unsigned
类型。 unsigned
1111 1111
类型255
为implicit 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}}的范围内。