weixin_43113933
2020-04-13 12:26
采纳率: 97.2%
浏览 206

C语言无符号数和有符号数的细节

#include
#include

int main()
{
int a = -1;
unsigned int b = 1;

if(a > b)
    printf("a > b, a = %d, b = %u\n", a, b);
else
    printf("a <= b, a = %d, b = %u\n", a, b);
exit(0);

}
//运行结果
a > b, a = -1, b = 1

我想问的是网上资料说的都是有符号数int 向无符号数unsigned int转化
,因为在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647
,unsigned int是32位,范围0 to 4,294,967,295,所以int向范围更大的隐式
转换,可是我不能理解的是为什么不可以unsigned int隐式转化为int呢,超过unsigned int正数最大值的用负数表示不是一样的道理吗?比如unsigned int
的值2,147,483,648超过int的最大值,那么转化为int时就变为对应的负数,这样不可以吗?求解各位大佬

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duel球球 2020-04-13 16:56
    已采纳

    int比unsigned int多了一位符号位。
    int的负数是用补码来储存的。
    int和unsigned int型都是4个字节,即32位的二进制数。
    其中int型把最高的1位来代表符号位。
    所以int型的负数强制转换成unsigned int型就会变成一个很大的正数了,所以你代码里面的a>b。

    附上测试代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        unsigned int b =  4294967295;
        printf("b : %u\n", b);
        int a = (int) b;
        printf("a : %d\n", a);
        return 0;
    }
    

    打印结果:

    b : 4294967295

    a : -1

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题