隐式转换如何使用带符号的字符和unsigned int?

时间:2017-11-28 09:58:20

标签: c integer-arithmetic type-promotion

#include<stdio.h>
void main()
{
    unsigned x = 1;
    signed char y = -1;
    if(x  > y)
        printf("x > y");
    else if(x == y)
        printf("x == y");
    else
        printf("x < y");
    printf("\n");
    printf("%d",(signed char)x);
    printf("\n");
    printf("%d",(unsigned int)y);
}

OUTPUT:
x < y
1
-1

我期望输出为x == y,因为在比较时,签名字符应该转换为unsigned int? 请解释我x&lt; Y ...

1 个答案:

答案 0 :(得分:3)

  

我期望输出为x == y,因为在比较时,签名字符应该转换为unsigned int?

嗯,你已经到了一半。

-1的值被转换(实际上被提升)为unsigned int时,该表示产生可由该类型表示的最大可能值。因此,促销价值变得大于x 1

引用C11,章节§6.3.1.8,常用算术转换

  

否则,如果具有无符号整数类型的操作数的等级大于或等于   等于另一个操作数的类型的等级,然后是操作数   有符号整数类型转换为带有unsigned的操作数的类型   整数类型。

澄清一下,促销并不意味着,它取消了签名。带符号的操作数(值)被视为提升类型。该值由位表示确定。细节:章节§6.3.1.3,

  

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

添加到上面的用法

printf("%d",(signed char)x);

printf("%d",(unsigned int)y);

不好。 %d期望有符号整数类型(int)作为参数。

  • 如果您要打印signed char值,请使用%hhd
  • 如果您要打印unsigned int,请使用%u