zoukankan      html  css  js  c++  java
  • 关于unsigned int和int的加法

    补码(two's complement) 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
    计算机中的符号数有三种表示方法,即原码反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
    补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

    先看代码:

    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
            int a = -6;
            unsigned int b = 4;
            if(a+b > 0)
                    printf("a+b>0
    ");//这句话被打印
            else
                    printf("a+b<0
    ");
            int z = a+b;
            if(z > 0)
                    printf("z>0
    ");
            else
                    printf("z<0
    ");//这句话被打印
            unsigned int uni=a+b;
            int i = a+b;
            printf("uni=%u, i=%d
    ", uni, i);//uni=4294967294, i=-2
            printf("uni=%d, i=%d
    ", uni, i);//uni=-2, i=-2
            printf("uni=%u, i=%u
    ", uni, i);//uni=4294967294, i=4294967294
            if(i==uni){
                    printf("equal
    ");//这句话被打印
            }else{
                    printf("not equal
    ");
            }
    }

    解释一下原因,int类型的最高位表示正负,如果最高位是1,则表示负数。而unsigned int的最高位是有效数位。

    当int和unsigned in相加时,要将int转化为unsigned int,而int小于0,所以它的最高位是符号位,为1,所以转化的结果是一个很大的正数,在第一个if语句中,是两个“正数”相加,结果自然就大于0了。而在z = a+b这一句时,它把a+b的结果看做一个int类型,而a+b最高位为1,所以z是一个负数,所以打印的是第二个语句。

    参考了这篇文章:http://blog.csdn.net/thefutureisour/article/details/8147277

  • 相关阅读:
    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
    CSS——display和float
    jQuery对象与dom对象相互转换
    jQuery选择器
    CSS样式表继承详解
    CSS position relative absolute fixed
    HTML——选择器
    2018-03-30
    IDEA检出SVN项目
    IDEA快捷键
  • 原文地址:https://www.cnblogs.com/james6176/p/4283494.html
Copyright © 2011-2022 走看看