【问题标题】:printf format for difference of two unsigned ints两个无符号整数之差的 printf 格式
【发布时间】:2013-06-01 22:08:15
【问题描述】:

在纯 ANSI C (C89) 中,我有以下内容。

unsigned y=<smallnumber>,x=y+3;
printf("%<whatgoeshere>\n",x-y);

我应该在% 之后添加什么以确保它会打印3?我可以在这里看到%u(如果两个操作数都是,则结果是无符号的)和%d(将参数传递给printf 时,整数表达式转换为int)的参数。

当然,两者都适用于任何合理的编译器,这正是我在这里问的原因。 :-) 我有一种感觉,根据标准,只有一个是真正正确的(但即使这样也可能是错误的)。

【问题讨论】:

    标签: c printf ansi unsigned-integer


    【解决方案1】:

    未签名。使用%u。在对整数表达式执行默认提升时(因为 printf() 是一个可变参数函数),不会发生无符号到有符号的转换。

    【讨论】:

    • 具体来说,unsigned int 不会提升为 signed intunsigned charunsigned short 将是,但前提是它们的范围是 unsigned int 范围的子范围。
    • @H2CO3“未发生无符号到有符号的转换” - 你确定吗?刚刚使用 %dx=y-3 在 Visual Studio 中签入。我在控制台看到-3
    • @KeithThompson 是的,没错。
    • @kotlomoy 错误 - 您将转换说明符在不匹配类型上的行为(顺便说一句,这会导致未定义的行为)与实际发生的情况混淆。试试printf("%d\n", (unsigned)-1); - 它很可能会打印出-1,尽管您已经将输入转换为unsigned
    • @H2CO3 “它很可能会打印 -1”——这就是我要说的。未签名的 (unsigned)-1 已转换为已签名的 -1。我看不出这里怎么没有转换。
    【解决方案2】:

    这边

    printf( "%d\n", (int)(x-y) );
    

    它适用于 x %u。

    虽然如果x-y 的结果超出有符号整数的范围,它就不起作用。

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 2017-10-25
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2013-02-04
      • 2021-09-09
      相关资源
      最近更新 更多