当前位置: 首页 > 知识库问答 >
问题:

无符号字符的格式说明符

陶涵育
2023-03-14

说我想打印unsignchar

unsigned char x = 12;

这是正确的。这:

printf("%d",x);

或者这个:

printf("%u",x);

事情是在其他地方,所以我遇到了这样的讨论:

-即使ch变为无符号字符,代码的行为也不是由C标准定义的。这是因为无符号字符被提升为int(在普通的C实现中),所以int被传递给printf的说明符%u。但是,%u需要一个无符号int,所以类型不匹配,并且C标准没有定义该行为

-你的评论不正确。C11标准规定转换说明符必须与函数参数本身的类型相同,而不是升级的类型。hh-length修饰符的描述中也特别提到了这一点:“参数将根据整数提升而提升,但其值应在打印前转换为有符号字符或无符号字符”

那么哪个是正确的呢?这件事有可靠的消息来源吗?(在这种意义上,我们还应该打印带有%d的< code >无符号短整型,因为它可以提升为< code >整型?).

共有3个答案

段坚
2023-03-14
匿名用户

对于跨平台开发,我通常通过使用< code>inttypes.h来绕过提升问题

http://pubs . open group . org/online pubs/009695399/based EFS/int types . h . html

这个头文件(在C99标准中)定义了基本类型的所有printf类型。所以如果你想要一个uint8_t(我强烈建议使用这种语法而不是无符号字符),我会使用

#include <inttypes.h>
#include <stdint.h>
uint8_t x;
printf("%" PRIu8 "\n",x);

史烨
2023-03-14

无符号字符x=12的正确格式说明符取决于以下几点:

如果INT_MAX

printf("%d",x);

否则,使用"%u"(或"%x""%o")。在这种情况下,无符号字符被提升为无符号

printf("%u",x);

最新的编译器支持“hh”长度修饰符,以补偿这种歧义。如果x 由于可变参数的标准提升而升级为 int无符号printf() 会在打印前将其转换为无符号 char

printf("%hhu",x);

如果处理没有“hh”的旧编译器或寻求高度可移植的代码,请使用显式转换

printf("%u", (unsigned) x);

相同的问题/答案适用于无符号短,除了INT_MAX

岳炎彬
2023-03-14

正确的是*:

printf("%d",x);

这是因为默认参数提升是因为printf()是可变函数。这意味着unsigned char值始终提升为int

来自N1570(C11草案)6.5.2.2/6

如果表示被调用函数的表达式的类型不包含原型,则会对每个参数执行整数提升,并且具有float类型的参数会提升为double。这些称为默认参数提升。

6.5.2.2/7子句告诉:

函数原型声明符中的省略号使参数类型转换在最后声明的参数之后停止。默认参数提升是对尾部参数执行的。

这些整数提升在6.3.1.1/2布尔值、字符和整数中定义:

如果 int 可以表示原始类型的所有值(对于位字段,受宽度限制),则该值将转换为 int;否则,它将转换为无符号 int。这些称为整数升级.58) 所有其他类型都因整数升级而保持不变。

这句话回答了你的第二个问题< code>unsigned short(见下面的评论)。

*除了超过8位无符号字符(例如,它可能占用16位),请参阅@chux的答案。

 类似资料:
  • 我尝试使用此代码片段将两个变量作为输入:- 但这会引起以下警告:- 警告:格式'%u'需要类型为'无符号整数*'的参数,但参数2的类型为'无符号整数'[-Wformat]警告:格式'%lu'需要类型为'长无符号整数*'的参数,但参数2的类型为'长无符号整数'[-Wformat]有人能向我解释一下这里发生了什么吗?

  • 问题内容: 下面是我以前如何将浮点数截断到两位小数 我检查了文档和电子书,但无法弄清楚。谢谢! 问题答案: 根据David的回答,到目前为止,我最好的解决方案是 我认为这是最类似于Swift的解决方案,将格式化操作直接与数据类型相关联。可能是某处有一个内置的格式化操作库,或者它可能很快就会发布。请记住,该语言仍处于测试阶段。

  • 本文向大家介绍Fortran 分配格式说明符,包括了Fortran 分配格式说明符的使用技巧和注意事项,需要的朋友参考一下 示例 在Fortran 95之前,可以将分配的格式用于输入或输出。考虑 该assign语句将语句标签分配给整数变量。以后将此整数变量用作print语句中的格式说明符。 在Fortran 95中删除了这种格式说明符分配。相反,更现代的代码可以使用其他形式的执行流控制 或字符变量

  • Spring 4.3.30 hibernate 5应用程序。pom.xml具有所有log4j2依赖项。 甚至增加了log4j2.xml 我得到的错误是: 我还错过了什么,因为即使我的模式不包含默认布局,我也一直在出错?我在迁移到log4j之前使用log4jlog4j2.Din计划迁移到log4j2,但由于我必须升级Spring和hibernate,我开始找到ERROR StatusLogger N

  • 我有一个运行在Tomcat 8上的web应用程序的log4j2配置文件,如下所示 我看到我的 Web 应用写入日志文件,但我对线程名称的 %t 模式似乎无法解析,因此我收到这样的日志语句 请注意,我得到%t而不是线程名称 所以为了解决这个问题,我使用选项启动了Tomcat 当webapp正在部署和log4j2正在初始化时,我看到catalina.out中打印出以下消息。 我的web应用程序包含以下

  • 由于ANSI C99,通过有或。但是bool是否也有格式说明符? 它将打印: