c - 如何在不使用强制转换的情况下 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);
}
解决方案
这些_ExtInt
类型是 Clang (LLVM) 中的一项新功能,如The New Clang _ExtInt
Feature 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
在任何机器(或%ld
64 位机器)上使用。如果你比这更大,你就靠自己了;您需要一个printf()
知道如何处理_ExtInt
类型的实现,并且可能具有允许指定长度的格式的符号。例如,疯狂地假设,它可能支持%<700>d
带符号的_ExtInt(700)
.
推荐阅读
- html - 如何为 flex-direction 列提供最大高度?
- sql - PL/SQL 块查找每个国家的供应商数量
- sql - 从 1 行 3 列制作 3 行 1 列
- node.js - 在使用实例创建索引时在类之间调用实例(打字稿)
- azure-devops - 运行声纳质量门状态的管道时出错
- java - 如何检查在Junit的私有方法中传递了哪个值?
- c# - 如何在 c# 项目中使用 c++ dll
- chaos - 使用 Chaos 工具包在 Kubernetes 集群(AKS)中创建节点的实验
- java - 如何获取 android 12 时钟的应用程序 BottomNavigationView?
- c# - Polly 和 HttpClient 无限请求