签名和未签名的程序错误

时间:2015-04-13 05:17:14

标签: c

所以今天我正在学习有符号和无符号变量。所以我可以得出的结论是,signed可以有正值,负值和零值,而unsigned只能有正值。 所以通过代码尝试这个我在c:

中编写了这个程序
#include <stdio.h>
#include <stdlib.h>


void main()
{
    int a=-10;
    unsigned int x=-4;
    printf("signed variable value is : %d\n Unsigned variable value is : %u",a,x);


}

根据我的预期输出应该是这样的:

signed variable value is : -10
Unsigned variable value is : 4

但实际上事实证明是这样的:

signed variable value is : -10
Unsigned variable value is : 4294967292

任何人都可以解释这个!!

3 个答案:

答案 0 :(得分:1)

如果您将一个负值分配到unsigned int并使用格式说明符%u进行打印,则会考虑该数字的2个补码。
/> 因此x成为-4的补充,即4294967292

这里有一个类似的问题 Assigning negative numbers to an unsigned int?

答案 1 :(得分:0)

unsigned变量的工作方式是它们绕过0(前后两个),将0视为2 32 (在32位系统上) 。要查看此内容,请尝试以下程序:

#include <stdio.h>

int main()
{
    unsigned int test = 3;

    for (int i = 0; i < 10; ++i)
    {
         test = test - 1;
         printf("%u\n", test);
    }
}

输出(在32位系统上):

2
1
0
4294967295
4294967294
4294967293
4294967292
4294967291
4294967290
4294967289

返回您的代码。 -4当然与0 - 4相同,所以你得到的是此列表中0之后的第四个项目。

NB。除了void main

之外,您的代码没有任何错误

答案 2 :(得分:-2)

无符号变量不会为您取绝对值。

由于您在其中添加了负值,因此它将有符号整数值(-4)转换为4字节无符号变量。

我猜这里将负值存储为1的补码。因此,你在无符号4byte变量上得到的-4实际上是2 ^ 32 -4(一个环绕):4294967292