关于C中scanf的转换说明符

About conversion specifier of scanf in C

我对 C 中 scanf 的转换说明符有疑问。

#include <stdio.h>

int main(void)
{
    int num1;
    scanf("%hhd",&num1);
    printf("%d \n",num1);
}

由于我在 scanf 函数中输入了 "%hhd" 作为转换说明符,所以当我输入“128”时,我希望 -128 存储在 num1 中。但是结果显示128存储在num1.

即使我使用 "%hhd" 将输入指定为 char int,为什么会发生这种情况?

第 1 步有 scanf() 个问题:检查结果。除非 return 值表示某些内容已写入 num1,打印它不会反映用户输入。

int num1;
if (scanf("%hhd",&num1) == 1) {
  printf("%d \n",num1);
}

第 2 步:启用编译器警告。节省时间。

if (scanf("%hhd",&num1) == 1) {
// warning: format '%hhd' expects argument of type 'signed char *', 
// but argument 2 has type 'int *' [-Wformat=]

Why does this happen even though I have used "%hhd" to specify input as char int?

这与整数类型无关:intchar。这是关于指针的:int *signed char *scanf() 中的 "%hhd" 匹配指针:signed char *(或 unsigned char *char *),而不是 intchar

代码通过 &num1,一个 int *。合规代码将传递 signed char *.

If a conversion specification is invalid, the behavior is undefined. C11 §7.21.6.2 13

就是这样。代码违反了规则,预期的行为没有发生。使用正确的类型。

signed char num1;
if (scanf("%hhd",&num1) == 1) {
  printf("%d \n",num1);
}

如果代码必须将结果保存在 int:

int num1;
signed char ch1;
if (scanf("%hhd",&ch1) == 1) {
  num1 = ch1;
  printf("%d \n",num1);
}