关于unsigned int和int的加法

先看代码:

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

下面解释一下原因:当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

时间: 2024-11-09 18:18:44

关于unsigned int和int的加法的相关文章

unsigned int与int相加问题

作者 : 卿笃军 一道unsigned int与int类型的相加题目,引发了我对这个问题的思考. 首先要明白两个问题: 问题一. unsigned int 和 int到底哪个能表达出来的数上限大呢? 答:当然是unsigned int. 为什么? 答:因为,int将最高位看做是符号位,0表示'正',1表示'负',也就是说,最高位不能用来存值. 问题二. 当计算机进行两数相加的时候会如何进行类型转换呢? 答:当然是将上限小的转化为上限大的咯.(就是将int类型转化为unsigned int类型).

(转载)深入解析unsigned int 和 int

就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是默认有符号的.2.unsigned-----无符号,修饰int .char3.long------长型,修饰int .double4.short------短型,修饰int 我们主要来看一下signed和unsigned与int之间的联系与区别.什么叫做有符号,什么叫做无符号这个问题其实很简单,比如

unsigned int与int相加

int main() { int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//这句话被打印 else printf("a+b<0\n"); int z = a+b; if(z > 0) printf("z>0"); else printf("z<0");//这句话被打印 } 当int和unsigned in相加时,要

C语言里int,unsigned int,shor int...转换输出问题

这问题,有时候是个困扰,抽空梳理一遍. signed char->unsgned char:%c->%c 0->127(对应范围) char->int:%c->%d->%c,'A'->65(可打印字符表对应) short int->int:%d->%d,100->100(对应,反向操作若超出范围,循环读取对应) short int->unsinged int:%u->%d,(对应,反向操作若超出范围,循环读取对应) unsigned

一道试题引发的血案 int *ptr2=(int *)((int)a+1);

某日,看到一道比较恶心的C语言的试题,考了很多比较绕的知识点,嘴脸如下: int main(void) { int a[4] = {1, 2, 3, 4}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%x, %x/n", ptr1[-1], *ptr2); return 0; } 问,在x86平台下输出啥? 题目虽然恶心了点,但作为一个例子来分析,还是挺好玩的.学过C语言的朋友可以暂且不看下文,自

write(byte[] b, int off, int len)

write(byte[] b, int off, int len)就是将数组 b 中的 len 个字节按顺序写入输出流. 所以如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,又或者 off+len 大于数组 b 的长度,则抛出 IndexOutOfBoundsException. 如果 len 为零,则不写入字节. 否则,首先写入字节 b[off],然后写入字节 b[off+1],依此类推:最后一个写入字节是 b[off+len-

Convert.ToInt32、(int)和int.Parse三者的区别

前者适合将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]); (int)适合简单数据类型之间的转换: int.Parse适合将string类类型转换成int类型,如int.Parse(session["shuzi"].ToString()). (1)这两个方法的最大不同是它们对null值的处理方法:    Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会

关于Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)这个方法

============问题描述============ Bitmap android.graphics.Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height) 这个方法屌爆了,不会用 后面的四个参数到底啥意思啊 不是说截的是一个矩形的x,y,宽高吗/ 为何我传入这个: Bitmap bitmap = Bitmap.createBitmap(b1, 0, 20, b1.getWidth(), b1.getHe

35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

  35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和: (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n!): (4)编写测试类E,在测试类E的main方法中使用接口回调的形式来测试实现 接口的类. p