打印为十六进制 (0x) 或十进制,具体取决于没有 if 语句的值 - 如何?

print as HEX (0x) or Decimal depending on value without if statements - how to?

提问人:Madhu Narayanan 提问时间:10/16/2023 更新时间:11/5/2023 访问量:137

问:

我正在尝试打印一个整数,其格式应为 %d 十进制,除非其值为 FFFF,在这种情况下,它应该打印为0xFFFF。如果没有不必要的 if 和 else 语句,我无法这样做。是否可以在单个 printf 语句中执行此操作?也许使用宏?有什么建议吗?

int d;

if(d==0xFFFF) {
    printf("%X",d);
} else {
    printf("%d",d);
}
c 十六进制 printf 格式说明符

评论

1赞 Loocid 10/16/2023
不管怎样,你都需要一个 if 语句,因为你在编译时不知道 d 的值。您可以使用三元运算符,但它仍然是一个分支。
0赞 Gerhardh 10/16/2023
“没有不必要的 if 和 else”那么也许它们不是不必要的。你希望通过用一些混淆的代码替换它来获得什么?if else
1赞 Jabberwocky 10/16/2023
也许是这样?printf(d == 0xffff ? "%X" : "%d", d)
0赞 Lundin 10/16/2023
既不便携,也不一定快,但至少没有分支:.是的,编写这样的代码可能是一个坏主意。printf((char[]){'%', 'd'+!(d%0xFFFF)*20, 0}, d);
1赞 chux - Reinstate Monica 10/16/2023
注意:对于 16 位,当 为 true 时为 true,即使 是正值。intd==0xFFFFd == -10xFFFF
1赞 Clifford 11/5/2023
如果肯定是“不需要的”而不是“不必要的”?

答:

2赞 Fe2O3 10/16/2023 #1

法典:

int main(void) {

    for( int e = 0xFFFE; e < 0x10002; e++ )
        printf( "%d\n\0%X\n" + ((e == 0xFFFF)<<2), e );

    return 0;
}

结果:

65534
FFFF
65536
65537

您将识别条件测试变量的值。真值(0 或 1)向左移动 2 位,有效地将其乘以 4。此值(0 或 4)被添加到 hacky 和自定义格式字符串的地址中,该字符串实际上是两个 C 字符串合二为一。either 或 将用于打印下一个参数。"%d\n\0""%X\n\0"printf()

现在,去阅读手册页,并弄清楚如何打印带有前导的十六进制值。(提示:更改为 将不起作用。为什么不呢?printf()0x"..\0%X..""..\00X%x.."

不要这样写代码。这绝对是一个黑客......

评论

0赞 chux - Reinstate Monica 10/16/2023
嗯,16 位总是如此。e < 0x10002int
0赞 Fe2O3 10/17/2023
@chux-ReinstateMonica 如果这样的约束构成了任务的一部分,我敢肯定 OP 会指定数据类型为......short:-)
0赞 Joshua 11/30/2023
“(提示:更改”..\0%X..“ 更改为 ”..\00X%x..“ 将不起作用。为什么不呢?对我有用。
0赞 Fe2O3 11/30/2023
@Joshua 然后要么你接受“Xffff”作为合法的十六进制表示法,要么你的编译器坏了......
0赞 Joshua 11/30/2023
@Fe2O3:产生输出。int main() { printf("0x%X\n", 0xFFFF); }0xFFFF
-1赞 chqrlie 10/29/2023 #2

您可以避免使用条件运算符的语句来选择语句:ifprintf

    d == 0xFFFF ? printf("FFFF") : printf("%d", d);

您可以将其组合到对以下各项的单个调用中:printf

    printf(d == 0xFFFF ? "FFFF" : "%d", d);

您可以避免使用条件运算符,并使代码更加隐晦:

    printf("FFFF\0%d" + (d != 0xFFFF) * 5, d);