- 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/
我想知道以下语句在 C 中会打印什么? printf("hello\n") || (printf("goodbye\n") || printf("world\n")); 我通常习惯于使用“cout”在
这是我目前正在学习的系统编程类(class)的幻灯片: catch_child 是 SIGCHLD 处理程序。输出与代码如何对应?为什么没有打印一些“Child #x started”消息? 最佳答案
这有点像拼图……我刚刚又回到了C,打算这次掌握它。所以我一直在阅读 The C Programming Language ,我得到了这个声明: Among others, printf also re
如何使用 printf 在字符串末尾附加空格? 我找不到任何在右侧附加空格的示例。 A similar question我发现使用 printf改为在字符串的左侧添加空格。 最佳答案 使用负数左对齐(
我想通过 usart 从 stm32f405 注销。 在我的 syscall.c 文件中,我实现了通过 usart 打印的功能: int _write(int file, char *ptr, int
我想定义一个记录器函数,比如 myPutStrLn = putStrLn . (++) "log: " main = do myPutStrLn "hello" 这很好。现在我想用 printf 格式
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
@H2CO3 这是我的主要代码: #pragma OPENCL EXTENSION cl_ amd_ printf : enable #define PROGRAM_FILE "matvec.cl"
Printf module API详细介绍了类型转换标志,其中: %B: convert a boolean argument to the string true or false %b: conv
您可以使用 printf 字段宽度说明符截断字符串: printf("%.5s", "abcdefgh"); > abcde 不幸的是,它不适用于数字(将 d 替换为 x 是相同的): printf(
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
我遇到了我见过的最奇怪的错误之一。 我有一个简单的程序,可以打印多个整数数组。 对数组进行排序,然后打印...... place_in_buf(n100, 100); insertion(10
我的程序是每隔一段时间获取文件大小并显示它以记录任何更改。由于某种原因,执行下面的代码挂起,只为我提供了一个光标。没有打印或显示任何内容。 代码: #include #include #inclu
printf("It is currently %s's turn.\n", current->name); 我想知道为什么在 %s 之后打印出额外的换行符。我知道C 中的字符串总是以\0 结尾。没有
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) fork() in c using printf [duplicate] (2 个回答) 已关闭 9
我对编程很陌生。 我正在尝试编写一个程序,从数组中调用水果的价格。但我希望代码在写价格之前也写水果的名称。如果我键入 2,如何使输出为“Orange price : 10”而不仅仅是 price :
这个问题在这里已经有了答案: How do I print a non-null-terminated string using printf? (2 个答案) 关闭 7 年前。 例如,我有一个字符
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
我有一个 atmel UC3-L0 和罗盘传感器。现在我安装 AtmelStudio 并将一些演示代码下载到电路板中。但是我不知道演示代码中的函数 printf 会在哪里出现数据。我应该如何获取数据?
嗨,我是 C 世界的新手,我的代码确实有些奇怪。目标是创建一个函数,可以在开头和结尾处用空格和/或制表符修剪字符串。我无法使用字符串库。 问题是我的代码中有一个 printf 只是用于测试,它的工作非
我是一名优秀的程序员,十分优秀!