zoukankan      html  css  js  c++  java
  • unsigned与int相加的问题

    int main()
    {
        int i=-20;
        unsigned j=10;
        cout<<i+j<<endl;
        system("pause");
        return 0;
    }

    输出结果:4 294 967 286

    2^32-10=4 294 967 296-10=4 294 967 286

    两个兼容的不同类型的操作,哪个能表示更大的数就转为哪个类型。例如short+long,就要转为long;unsigned+signed,就要转为unsigned。

    在32位机上
    unsigned int 最大可表示2^32 - 1
    int最大可表示2^31-1
    这样int就转为了unsigned int,由于y<0,即y的最高位符号位是1,转为unsigned int后最高为不再是符号位,而是一个最高位的正数,于是两者相加就会是一个很大的正数了。

    也许你会问为什么“哪个能表示更大的数就转为哪个类型”?

    因为计算机(注意,是计算机,不是编译器,也不是操作系统)总是希望能尽量大的囊括结果,防止溢出产生错误(尽管有人会说向下溢出怎么办,但别忘了,负数加减换成补码也成了正数的加运算)。

             int -20在32位计算机中的存储形式为:1111 1111 1111 1111 1111 1111 1110 1100 第一位1为符号位,负

    unsigned   10在32位计算机中的存储形式为:0000 0000 0000 0000 0000 0000 0000 1010

    unsigned+int 后结果转为unsigned存储,故int -20转化为unsigned int,由于符号位为1,转为unsigned int 后最高位不再是符号位,而是一个最高正的位数,两者相加为

    1111 1111 1111 1111 1111 1111 1111 0110 即为4 294 967 286。

  • 相关阅读:
    UOJ168. 【UR #11】元旦老人与丛林
    luogu3308,LOJ 2196 [SDOI2014]LIS
    CF1349F2. Slime and Sequences (Hard Version)
    6210. wsm
    欧拉数学习小记
    CF1508F. Optimal Encoding
    CF1508C. Complete the MST
    联合省选2021 游记
    一. Docker介绍
    Elasticsearch
  • 原文地址:https://www.cnblogs.com/yanglf/p/2759412.html
Copyright © 2011-2022 走看看