scanf()中%u和%d之间的差异

Pal*_*lec -1 c++ scanf cstdio

在C++中,如果我从一个字符串中读取一个整数,那么我是否使用ud作为转换说明符并不重要,因为它们都接受负整数.

#include <cstdio>
using namespace std;

int main() {
    int u, d;
    sscanf("-2", "%u", &u);
    sscanf("-2", "%d", &d);
    puts(u == d ? "u == d" : "u != d");
    printf("u: %u %d\n", u, u);
    printf("d: %u %d\n", d, d);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone.com

我挖得更深,发现是否有任何区别.我找到

int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
Run Code Online (Sandbox Code Playgroud)

相当于

int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);
Run Code Online (Sandbox Code Playgroud)

根据cppreference.com.

是否有任何差异之间的所有ud使用解析这些转换说明,即传递给格式时scanf型的功能呢?它是什么?

C和C++的答案是一样的,对吧?如果没有,我对两者都感兴趣.

Bar*_*art 9

%d:将整数扫描为小数signed int.类似的转换说明符,%i在前面加上时将数字解释为十六进制,0x并在前面加上八进制0.否则,它是相同的.

%u:将整数扫描为小数unsigned int.