Ios 将无符号int与%u和%x一起使用时出现意外值

Ios 将无符号int与%u和%x一起使用时出现意外值,ios,c,Ios,C,今天,我正在开发一个示例iOS应用程序,其中包含如下代码: unsigned int uCount = 0; int iJoke = -7; uCount = uCount + iJoke; 但当我把它打印成这样: ╔══════════════════╦══════════════════════╦════════════╗ ║ Format Specifier ║ Print Statement ║ Output ║ ╠══════════════════╬═══════

今天,我正在开发一个示例iOS应用程序,其中包含如下代码:

unsigned int uCount = 0;
int iJoke = -7;
uCount = uCount + iJoke;
但当我把它打印成这样:

╔══════════════════╦══════════════════════╦════════════╗
║ Format Specifier ║   Print Statement    ║   Output   ║
╠══════════════════╬══════════════════════╬════════════╣
║ %d               ║ NSLog(@"%d",uCount); ║ -7         ║
║ %u               ║ NSLog(@"%u",uCount); ║ 4294967289 ║
║ %x               ║ NSLog(@"%x",uCount); ║ fffffff9   ║
╚══════════════════╩══════════════════════╩════════════╝
我期望%u的输出为7

然后我用的是:

unsigned int i = 0;
int j = -7;
i = i + abs(j);
输出如下所示:

╔══════════════════╦══════════════════════╦════════╗
║ Format Specifier ║   Print Statement    ║ Output ║
╠══════════════════╬══════════════════════╬════════╣
║ %d               ║ NSLog(@"%d",uCount); ║      7 ║
║ %u               ║ NSLog(@"%u",uCount); ║      7 ║
║ %x               ║ NSLog(@"%x",uCount); ║      7 ║
╚══════════════════╩══════════════════════╩════════╝
虽然我的问题已通过
abs()
解决,但我很想知道为什么在我的第一个案例中%u给出了
4294967289


请帮忙,提前谢谢

ARM在中存储负数,因此当读取为无符号数时,
-7
表示为
0xfffff9


这样表示负数的主要优点是,添加有符号整数的指令与添加无符号整数的指令相同。

此赋值将以表示
-7
(2的补码)的模式分配给无符号整数。无符号整数将是非常大的无符号值

对于32位整数,这将是
2^32-7=4294967289

标准的说法如下


“如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2^n,其中n是用于表示无符号类型的位数)。[注意:在2的补码表示中,此转换是概念性的,并且位模式没有变化。”(如果没有截断)。-end note]
ijoke
被提升为无符号整数。在大多数编译器上,有符号位被扭曲以提供一个大的正数

使用无符号操作数时,转换规则更为复杂

例如,假设int为16位,long为32位,那么-1L<1U,因为1U(int)被提升为有符号long

因为您似乎有一个32位int:

4294967296-7=4294967289


一般来说,大多数隐式转换都是在不丢失信息的情况下将“较窄”的操作数转换为“较宽”的操作数。

但这不是我认为的问题。@DineshRaja他在解释为什么无符号数被提升为较大的正数。不同的系统在这方面有不同的方法——这取决于机器。什么引用的页码是从哪里来的?或者你能提供一个链接吗,谢谢。对不起,我没有任何链接。你可以在N3485-Open-std.org标题4.7.2中找到它。我肯定我能找到它。即使我忘记了一些涉及无符号操作数的转换规则!除了有符号与无符号提升之外,为什么你希望在添加时打印7d-7到0?如果可以有一个合理的期望,那就是-7。@H2CO3:这是一个示例代码,而不是我写的enetire代码。我对
4294967289
很好奇。这是因为无符号整数算术是由标准明确定义的,这样溢出和下溢会相互缠绕。你是从零减去七,为什么在你会认为这相当于增加七个吗?