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 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题