首页 > 解决方案 > 如何在不使用强制转换的情况下 printf _ExtInt?

问题描述

我想知道你怎么能printf _ExtInt在不使用演员表的情况下发出叮当声。像这样的东西:

#include <stdio.h>

int main() {
    _ExtInt(13) foo = 100;
    printf("%???", foo);
}

使用演员表,它看起来像这样(这不是我想要的):

#include <stdio.h>

int main() {
    _ExtInt(32) foo = 100;
    printf("%d", (int) foo);
}

标签: cintegerprintfclangextint

解决方案


这些_ExtInt类型是 Clang (LLVM) 中的一项新功能,如The New Clang _ExtIntFeature Provides Exact Bitwidth Integer Types中所述,于 2020 年 4 月 21 日发布(3 天前我输入)。

如果_ExtInt(32)是 32 位有符号整数类型并且int是 32 位有符号整数类型,那么您可以%d在对printf(). 格式后的参数受整数提升规则的约束,所以我希望两者_ExtInt(13)_ExtInt(32)都会在int它们传递给时被转换为printf(),所以正确的转换说明符是%d.

如果您使用更大的类型,最多_ExtInt(64),您可能可以%lld在任何机器(或%ld64 位机器)上使用。如果你比这更大,你就靠自己了;您需要一个printf()知道如何处理_ExtInt类型的实现,并且可能具有允许指定长度的格式的符号。例如,疯狂地假设,它可能支持%<700>d带符号的_ExtInt(700).


推荐阅读