weixin_43113933 2020-04-13 12:26 采纳率: 58.3%
浏览 230
已采纳

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 9月25日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?