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

    作者 : 卿笃军


    一道unsigned int与int类型的相加题目。引发了我对这个问题的思考。

    首先要明确两个问题:

    问题一、

    unsigned int int究竟哪个能表达出来的数上限大呢?

    答:当然是unsigned int

    为什么?

    答:由于。int将最高位看做是符号位。0表示'正',1表示'负'。也就是说,最高位不能用来存值。

    问题二、

    当计算机进行两数相加的时候会怎样进行类型转换呢?

    答:当然是将上限小的转化为上限大的咯。(就是将int类型转化为unsigned int类型)。

    为什么?

    答:我们知道int + double 会所有转化为double型相加。而计算机在进行两数相加的时候,为了避免数据溢出,就转化为上限较大的类型进行操作了~~~


    以下,我们以32位机上面的加法进行分析:

    演示样例:

    unsigned int a = 0;

    int b = -1;

    a + b = ?

    第一步:将int b  = -1;转化为unsigned int 类型,就是将最高位的符号位1看成是存放的值。

    那么-1在内存中是怎样存放的呢?

    答:-1就是,1取反然后—+1;

    32位机,就是4*8 = 32(8个字节,每一个字节占4位);

                                      1        2        3        4      5       6          7        8

    1的二进制原码:0000 0000 0000 0000 0000 0000 0000 0001

    1的二进制取反:1111 1111 1111 1111 1111 1111 1111 1110

    1二进制取反+1:  1111 1111 1111 1111 1111 1111 1111 1111   这就是-1在内存中的存放形式

    而1111 1111 1111 1111 1111 1111 1111 1111(二进制)   =  4294967295(十进制)

    第二步:运行a+b操作

    所以,上面的问题就转化为了 4294967295 + 0 = ?

    非常显然结果就是:4294967295

    附上C语言代码:

    #include <stdio.h>
    
    int main()
    {
    	unsigned int a = 0;
    	int b = -1;
    
    	printf("%u
    ",a+b);
    	
    	return 0;
    }



    參考文献:随心的博客园,unsigned与int相加的问题,http://www.cnblogs.com/yanglf/archive/2012/11/07/2759412.html

  • 相关阅读:
    UVA1585
    暑期第二场-1
    UVA11582
    UVA10006
    HDU1005
    HDU2035
    POJ:2492-Bug's Life(二分图的判定)
    Codeforces:68A-Irrational problem(暴力大法好)
    Codeforces Round #456 (Div. 2) B. New Year's Eve
    Codeforces Round #456 (Div. 2) A. Tricky Alchemy
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5318983.html
Copyright © 2011-2022 走看看