将一个负数赋值给一个无符号数会出现什么情况呢

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将一个负数赋值给一个无符号数会出现什么情况呢相关的知识,希望对你有一定的参考价值。

在正文开始之前,我们先看一下下面这段看似简单的代码:

#include <stdio.h>

int main()

    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%d,b=%d,c=%d\\n", a, b, c);
    return 0;

那么这段代码的输出结果是什么呢?
答案是:
-1
-1
255

关于上面的代码,首先我们要说的缺省情况下的char内心是有符号的,所以第一条赋值语句和第二条赋值语句等效。

而对于第三条代码,我们将一个负数赋值给了一个无符号数,想想为什么会得到255这样的结果?

首先,对于-1,对于这个数来说,它本身是一个负数,我们知道在计算机中,所有内容的存储都是以二进制形式存储的,而且是以补码形式存储的。因此,对于这里的问题,我们需要分析下这个转变的过程。

以一个字节为例说明:
-1的原码是:
10000001
反码:
11111110
补码:
11111111

好,我们现在再来看这个问题,计算机中存储了-1的补码,也就是11111111,这时候,我们将它赋值给了变量c,而c是无符号的,那么11111111就会被直接当做无符号数来转换,对于无符号数来说11111111的十进制表示就是255。所以这就是为什么最后会得到255的结果。

以上是关于将一个负数赋值给一个无符号数会出现什么情况呢的主要内容,如果未能解决你的问题,请参考以下文章

无符号数和有符号数的转化

有符号与无符号数之间赋值的截断和扩展

为啥有符号负数转换为无符号数?

理解有符号数和无符号数

有符号数的范围

原码反码补码