- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
printf
函数族提供了一系列长度修饰符,其中两个是 hh
(表示 signed char
或 unsigned char
参数提升为 int
) 和 h
(表示 signed short
或 unsigned short
参数提升为 int
)。从历史上看,这些长度修饰符只是为了与 scanf
的长度修饰符创建对称而引入的,很少用于 printf
。
这是 ISO 9899:2011 §7.21.6.1“fprintf 函数”¶7 的摘录:
7 The length modifiers and their meanings are:
hh
Specifies that a followingd
,i
,o
,u
,x
, orX
conversion specifier applies to asigned char
orunsigned char
argument (the argument will have been promoted according to the integer promotions, but its value shall be converted tosigned char
orunsigned char
before printing); or that a followingn
conversion specifier applies to a pointer to a signed char argument.
h
Specifies that a followingd
,i
,o
,u
,x
, orX
conversion specifier applies to ashort int
orunsigned short int
argument (the argument will have been promoted according to the integer promotions, but its value shall be converted toshort int
orunsigned short int
before printing); or that a followingn
conversion specifier applies to a pointer to a shortint
argument....
忽略 n
转换说明符的大小写,这些几乎相同的段落对 h
和 hh
的行为说了什么?
signed char
、signed short
、unsigned char
或 unsigned短
响应。对于带有 h
或 hh
长度修饰符的转换规范。是 未定义的行为, 因为参数不是从 char
、short
等类型转换而来的。之前。int
类型的每个值运行,并且 printf
的行为就好像参数已转换为 char
、short
等。转换前。§7.21.6.1¶7 的这三种解释中哪一种(如果有的话)是正确的?
最佳答案
标准规定:
If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
[C2011 7.21.6.1/9]
“正确的类型”的含义是可以理解的,但对我来说最合理的解释是转换规范“适用于”的类型,如前文所述,并在部分,在问题中。我将关于参数提升的括号评论视为承认普通参数传递规则,并避免这些函数是特殊情况的任何暗示。我不认为括号中的注释与确定参数的“正确类型”有关。
如果您传递一个比转换规范正确的类型更宽的参数,实际会发生什么是另一个问题。我倾向于相信 C 系统不太可能被任何人实现,以至于 printf()
参数实际上是一个 char
,还是是一个 int
,其值在 char
范围内。然而,我断言编译器检查参数类型与格式的对应关系并在不匹配时拒绝程序是有效的行为(因为在这种情况下所需的行为是明确未定义的)。
另一方面,我当然可以想象 printf()
实现如果参数值超出相应的转换说明符。由于行为未定义,这也是允许的。
关于c - 当 printf 的相应参数不是 short/char 时,使用 h 或 hh 长度修饰符是否非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529239/
C# 程序: short a, b; a = 10; b = 10; a = a + b; // Error : Cannot implicitly convert type 'int' to 'sh
这个问题已经有答案了: Promotion in Java? (5 个回答) 已关闭10 年前。 我有三个短变量。当我将两个相加并将结果分配给第三个时,Eclipse 告诉我需要将其转换为 Short
我正在开展一个项目,我需要获取一系列带符号的 16 位整数、负值和正值,并将它们发送到函数以在单元测试期间进行分析。 由于不同的原因,该函数仅采用无符号 16 位整数数组,因此我需要将有符号整数存储在
这个问题在这里已经有了答案: Implicit type promotion rules (4 个答案) 关闭 3 年前。 有如下代码: short a = 5; short b = 15; sho
我有以下代码: var v = [0xFF, 0xFF]; alert((v[0]> 16); 16位左移将所有位向左移动;算术 16 位右移在移位时处理符号。 (Javascript 使用 32 位
我正在尝试尽可能多地挤出我的内存。我有一个 4.9999995e13 整数矩阵,但它们只需要为真或假 - 基本上我只需要为这些整数中的每一个存储一位。 我知道 C 中没有单个位类型(也许有人可以向我解
这个问题已经有答案了: Different between parseInt() and valueOf() in java? (11 个回答) 已关闭 5 年前。 我最近偶然发现了another q
当我将相同的值分配给有符号和无符号的 short 并进行比较时,它失败了,但它适用于 int。除非我强制转换一个或另一个使它们成为相同的类型,否则比较不起作用。 #include int main()
所以我试图解释以下输出: short int v = -12345; unsigned short uv = (unsigned short) v; printf("v = %d, uv = %u\n
当我将相同的值分配给有符号和无符号的 short 并进行比较时,它失败了,但它适用于 int。除非我强制转换一个或另一个使它们成为相同的类型,否则比较不起作用。 #include int main()
这个问题在这里已经有了答案: What is the 'short' data type in C? (1 个回答) 关闭 7 年前。 将变量声明为 short int 和 short 有什么区别?
C 中的 short int 包含 16 位,第一位表示该值是负数还是正数。我有一个 C 程序如下: int main() { short int v; unsigned short
Short.parseShort(String s, int radix) 存在,Integer.parseInt(String s, int radix) 和 Long.parseLong(Stri
我想我可以从 this question 推断出来但我不能 我当然可以 short[] shortarray = {0,1,2}; List shortList = new ArrayList();
这个问题在这里已经有了答案: char and the usual arithmetic conversion rules (5 个答案) 关闭 6 年前。 假设 int 是 16 位类型,以防止从
到目前为止我已经试过了,但我仍然在下面的代码中遇到错误: #include typedef unsigned short unichar; typedef const unichar unimap_t
unsigned short int 和 c 中的 unsigned short decleration 之间有区别吗?如果有,那是什么?我尝试在网上查找,但找不到任何有值(value)的东西。 un
我有数据库,由于与另一位开发人员混淆,我需要在一个表中更改列的值。我有一个名为 credits 的表和一个名为 credit_type 的列。 credit_type 有 2 个值 long 和 sh
我在 JNI hell 中进行类型转换: 这是一般的流程: 读取一个文件,它返回一个一维 float 组。 转换这些floats[] 到 shorts[](*4095,我想要一个12位数字) 将这些短
我正在尝试优化两个 c 样式数组的点积,这些数组的大小为 contant 和 small,类型为 short。 我已经阅读了一些关于 SIMD 内在函数的文档以及许多关于使用此内在函数进行点积优化的博
我是一名优秀的程序员,十分优秀!