c++ - API 为 IP 返回 "incorrect"值,但如果您添加 256 或将负数输入 uchar,它就可以工作。发生了什么?

标签 c++ c printf endianness variadic-functions

例子: printf("%d %d\n", ip[0],ip[1]); 将打印 -64、-88。如果你加上 256 得到 192 168 无符号字符 a = -64; printf("%d", a); 将打印 192。知道发生了什么吗?

ip[] 是一个字符数组,就其值(value)而言。

最佳答案

Plain char 具有实现定义的签名,在您的情况下 signed

因为 printf 是可变参数函数,所以应用默认提升,这意味着您的 char 被提升为 int,保留值。

除非你告诉 printf 你传递了一个 unsigned char,它会认为它是一个 intunsigned int 并且不能撤销这些提升,含义:192 因为 char 是 -64 因为 int 是 -64 解释为无符号是 4294967195。

对于 unsigned char,正确的格式说明符是 "%hhu"

顺便说一句:具体数字假设CHAR_BIT==8, sizeof(int)==4, 2s-complement representation

关于c++ - API 为 IP 返回 "incorrect"值,但如果您添加 256 或将负数输入 uchar,它就可以工作。发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145162/

相关文章:

c - UndefinedBehaviorSanitiser 问题 - CS50 Vigenere

c - fprintf 在将其发送到文件时给出意外的输出

c - Malloc 的 char 数组有意外的输出

c++ - 从 C++ 函数返回对象的正确方法是什么?

c++ - 分配/释放大量小对象的策略

c++ - 表达式 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 错误

C 程序将值读入两个单独的部分?

c - 是否有与 Perl 的 Carp 模块等效的 C 语言?

c - 如何用C实现printf风格的函数

c++ - C++ 迭代器是否持有对底层对象的引用?