【问题标题】:How implicit conversion work with signed character and unsigned int? [duplicate]隐式转换如何处理有符号字符和无符号整数? [复制]
【发布时间】:2018-05-11 17:38:44
【问题描述】:
#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,因为在比较期间,有符号字符应该被转换为无符号整数? 请解释一下 x

【问题讨论】:

  • 正确缩进您的代码。机器(编译器)可以读取和编译任何东西,但是对于人类来说,它需要在将文本块读取为 code 时做出一点sense。提问时,文本区域右侧有一个橙色的大如何格式化框。还有一个完整的格式化辅助工具栏。还有一个 [?] 按钮提供格式化帮助。还有一个预览区域,显示您的帖子发布后的样子。使您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。
  • 为什么会期望 x == y?已签名到未签名并不意味着“删除符号”

标签: c integer-arithmetic type-promotion


【解决方案1】:

我希望输出是 x == y,因为在比较期间,有符号字符应该被转换为无符号整数?

好吧,你已经成功了。

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

引用C11,第 §6.3.1.8 章,通常的算术转换

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

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

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


补充一下,用法

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

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

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

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

【讨论】:

  • 有什么办法可以找到它转换为什么值?我试过类型转换...
  • @Insiyah_Hajoori,好吧,您必须使用正确的格式说明符,但是,您为什么要这样做?
  • @Sourav 只需添加关于滥用printf("%d",(unsigned int)y); 的注释,这是完美的答案。-
  • 其实你可能想用6.3.1.3中的摘录替换"该值由位表示确定" "否则,如果新类型是无符号的, 值是在新类型可以表示的最大值的基础上反复加减一,直到值在新类型的范围内。”
猜你喜欢
  • 2013-07-23
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多