- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设如下:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 8
printf
2 字节有符号数的格式为
%hd
, 对于 4 字节有符号数是
%d
, 对于 8 字节有符号数是
%ld
,但是 1 字节有符号数的正确格式是什么?
最佳答案
what is the correct format for a 1 byte signed number?
%hh
和您选择的整数转换说明符(例如,
%02hhX
。请参阅 C11 标准第 7.21.6.1p5 节:
hh
Specifies that a following
d
,i
,o
,u
,x
, orX
conversion specifier applies to a signed char or unsigned char argument (the argument will have been promoted according to the integer promotions, but its value shall be converted to signed char or unsigned char before printing);…
printf
),该函数永远不会看到
char
参数。许多程序员认为这意味着没有必要使用
h
和
hh
限定符。当然,您不会通过将它们排除在外而创建未定义的行为,而且大多数情况下它会起作用。
char
可能是有符号的,整数提升将保留其值,这将使其成为有符号整数。使用无符号格式(例如
%02X
)打印有符号整数将为您提供符号扩展的
F
s。因此,如果要使用无符号格式显示有符号
char
,则需要使用
printf
告诉
hh
整数类型的原始未提升宽度是多少。
/* Read the comments thread to this post; I'll remove
this note when I edit the outcome of the discussion into
the answer
*/
#include <stdio.h>
int main(void) {
char* s = "\u00d1"; /* Ñ */
for (char* p = s; *p; ++p) printf("%02X (%02hhX)\n", *p, *p);
return 0;
}
输出:
$ ./a.out
FFFFFFC3 (C3)
FFFFFF91 (91)
X
格式规范需要一个无符号参数,而
char
参数是(至少在产生所呈现输出的实现上)有符号.我认为这个论点依赖于 §7.12.6.1/p9:“如果任何参数不是相应转换规范的正确类型,则行为未定义。”
char
(和
short
)整数类型的情况下,参数列表中的表达式在调用函数之前被提升为
int
或
unsigned int
。 (值得注意的是,在大多数架构上,所有三种字符类型都将提升为有符号
int
;将
unsigned char
(或无符号
char
)提升为
unsigned int
只会发生在
sizeof(int) == 1
的实现中,其中 0791045)
%hx
或
%hhx
格式转换的参数将被签名,如果不使这些格式代码的使用变得毫无意义,就不能是未定义的行为。
fprintf
(和 friend )会以某种方式恢复原始表达式。它所说的是该值“应在打印前将
转换为 有符号字符或无符号字符”(第 7.21.6.1/p5 节,上面引用,强调添加)。
int
参数,以及一个明确定义的过程,用于将该值转换为
unsigned char
。因此,我认为上面介绍的程序是完全定义好的。
fprintf
的
%c
的行为定义如下(第 7.21.6.8/p8 节),强调补充:
the
int
argument is converted to anunsigned char
, and the resulting character is written.
void f(char c) {
printf("This is a '%c'.\n", c);
}
也是UB。然而,我认为几乎每个 C 程序员都写过类似的东西,而没有三思而后行。
fprintf
),参数现在是提升的值。
va_arg
宏,第 7.16.1.1 节),对参数类型的约束在括号中被注释为“实际下一个参数的类型(根据默认参数提升)”。
%c
和
char
参数是“技术上”UB)没有任何值(value);这改变了 UB 的概念,很难相信这样的禁令是故意的,这让我相信这种解释不是故意的。 (而且,也许应该在编辑上更正。)
关于c - 1 字节有符号数的 printf 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387867/
有没有办法使用 Clojure format(基于 java.util.Formatter)或 cl-format(基于 Common Lisp 的format) 以编程方式设置空格填充?如果您事先知
我正在尝试创建一个用户实体以及数据/文件(pdf格式)。上传并保存到数据库很好,但是当我让用户进入 postman 时尝试发送获取请求方法,然后在数据字段中显示一些糟糕的数据,而且我无法在数据库中看到
我必须将值为 {"STX","ETX"} 的普通字符串数组转换为十六进制值,并且我应该根据 http://www.asciitable.com/ 得到 {2,3} . 最佳答案 听起来你想要一个 Ma
我想格式化我的代码,但不确定哪种格式类型最适合我的项目需要。 我发现仅对于 dart 和 flutter 项目(我都有),有不止一个选项可用于格式化编程语言/框架中预先构建的代码。 Dart : da
我已经尝试了多个代码,例如这样 Sub DateFixer() Application.ScreenUpdating = False Application.Calculation =
SolrQuery query = new SolrQuery(); query.setQuery("*:*"); query.add("wt","csv"); server.query(query)
我有一个包含多个字符串的数据库,我从查询中获取了这些记录,并且我在 QString 中收到了这种格式的数据: "Mon, 13 Nov 2017 09:48:45 +0000" 所以,我需要根据文化来
我有一个 Delphi 2007 DBGrid,我想让用户以更新的 Excel 格式 (OOXML) 保存它,但我的标准是用户不需要安装 Excel。有没有人知道任何已经这样做的组件?是的,我已经搜索
我正在我们的普通 html 站点旁边创建一个移动站点。使用 rails 3.1。移动站点在子域 m.site.com 中访问。 我已经定义了移动格式(Mime::Type.register_alias
我正在尝试使用 xmlstarlet 格式化 xml 文件,但我不想创建新的 xml 文件。 我试过了 xmlstarlet fo --inplace --indent-tab --omit-decl
我在 A 列中有一个带有文本的电子表格。 例如 A1=MY TEXT1 A2=MY TEXT2 A3=MY TEXT3 A4=MY TEXT4 A5=MY TEXT5 我想在文本的前后添加撇号 结果是
我想做一些源代码转换(自动导入列表清理),我想保留注释和格式。我听说过一些关于解析器这样做的事情,我认为是 ghc 解析器。 看起来我可以通过从文件中提取内容来使用 hs-src-exts Langu
我在 Excel 中工作,我想根据另一张表中的列表找出一张表中是否有匹配项。 我已将值粘贴到列表中,并希望从另一张表中返回它们的相应值。包含字母和数字的单元格可以正常工作(例如:D5765000),但
我有一个 DurationField在我的模型中定义为 day0 = models.DurationField('Duration for Monday', default=datetime.time
我正在为我的应用程序开发 WMI 查询。它需要为给定的 VID/PID 找到分配的虚拟 COM 端口。使用 WMI Code Creator 我发现...... 命名空间:root\CIMV2 类:W
我试图弄清楚如何使用 NSTextList,但除了 this SO question 之外,在网上几乎没有找到有用的信息。和 the comment in this blog . 使用这个我已经能够创
我要查询all_objects表在哪里last_ddl_time='01 jan 2010'但它拒绝日期格式... 任何机构给我查询的确切格式? 最佳答案 正如 AKF 所说,您应该使用 Trunc除
我试图在我的应用程序中实现聊天功能。我使用了 2 个 JEditorPane。一个用于保存聊天记录,另一个用于将聊天发送到前一个 JEditorPane。 JEditorPane 是 text/h
我在大学里修了一个编译器类(class),内容非常丰富,很有趣,尽管也很多工作。既然给了我们要实现的语言规范,所以我学不到的一件事就是语言设计。我现在正在考虑创建一种有趣的简单玩具语言,以便我可以玩耍
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!