• signed和unsigned的比较


    这篇文章是转的,出处已经找不到了,对里面的说法也没有验证,这里只做保存供以后参考!如果其他兄弟发现下面的说法有错误,请指出。

     

    昨天,zrf师兄丢给我这样一个题,据说是微软面试题:

    unsigned int i=3;
    cout<<i * -1;
    问结果是多少。
     
    第一反应:-3。不过结果似乎不是这样的,写了个程序,运行了一下,发现是:4294967293。很诡异的一个数字,怎么也想不明白为什么会是这么个奇怪的数字。但是在我发现这数的十六进制数是FFFFFFFD时,我想我已经离答案很近了...
     
    这个涉及到了混合着不同数据类型的表达式中的数据类型的转换问题。在总结转换问题之前,先说明一下各种数据类型(只说明numeric类型的),下表来自MSDN:
    Type Name Bytes Other Names Range of Values
    int * signed,
    signed int
    System dependent
    unsigned int * unsigned System dependent
    __int8 1 char,
    signed char
    –128 to 127
    __int16 2 short,
    short int,
    signed short int
    –32,768 to 32,767
    __int32 4 signed,
    signed int
    –2,147,483,648 to 2,147,483,647
    __int64 8 none –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    char 1 signed char –128 to 127
    unsigned char 1 none 0 to 255
    short 2 short int,
    signed short int
    –32,768 to 32,767
    unsigned short 2 unsigned short int 0 to 65,535
    long 4 long int,
    signed long int
    –2,147,483,648 to 2,147,483,647
    unsigned long 4 unsigned long int 0 to 4,294,967,295
    enum * none Same as int
    float 4 none 3.4E +/- 38 (7 digits)
    double 8 none 1.7E +/- 308 (15 digits)
    long double 10 none 1.2E +/- 4932 (19 digits)

    对上表补充说明一下:
    1)在32位机上,int型和unsigned int型都是32位的(4个字节)。
    2)enum会跟据最大值来决定类型,一般来说为int型,如果超出int型所能表示的范围,则用比int型大的最小类型来表示(unsigned int, long 或者unsigned long)
    3)关于类型的大小。一般用所能表示的数据范围来比较类型的大小,如char型<unsigned char型<short型...在表达式中,一般都是由小的类型向大的类型转换(强制类型转换除外)
     
    下面结合自己查的资料,加上自己不断地举各种情况编程,总结一下关于类型转换(仅限于算术表达式中关于整数类型的转换)的一些问题(如有缺漏,欢迎补充,感激不尽)
    1、所有比int型小的数据类型(包括char,signed char,unsigned char,short,signed short,unsigned short)转换为int型。如果转换后的数据会超出int型所能表示的范围的话,则转换为unsigned int型;
    2、bool型转化为int型时,false转化为0,true转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值都转为true;
    3、如果表达式中混有unsigned short和int型时,如果int型数据可以表示所有的unsigned short型的话,则将unsigned short类型的数据转换为int型,否则,unsigned short类型及int型都转换为unsigned int类型。举个例子,在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647,unsigned short是16位,范围0 to 65,535,这样int型的足够表示unsigned short类型的数据,因此在混有这两者的运算中,unsigned short类型数据被转换为int型;
    4、unsigned int 与long类型的转换规律同3,在32位机上,unsigned int是32位,范围0 to 4,294,967,295,long是32位,范围–2,147,483,648 to 2,147,483,647,可见long类型不够表示所有的unsigned int型,因此在混有unsigned int及long的表达式中,两者都被转换为unsigned long;
    5、如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。
     
    经过这番总结,前面提出的问题的答案应该就很明显了吧。在表达式i*-1中,i是unsigned int型,-1是int型(常量整数的类型同enum),按第5条可以知道-1必须转换为unsigned int型,即0xffffffff,十进制的4294967295,然后再与i相乘,即4294967295*3,如果不考虑溢出的话,结果是12884901885,十六进制0x2FFFFFFFD,由于unsigned int只能表示32位,因此结果是0xfffffffd,即4294967293。
  • 相关阅读:
    浅谈大型网站的SEO策略及如何执行,互联网营销 狼人:
    需求为王,互联网营销 狼人:
    Google推出HTML 5练兵场 提供详尽代码示例,互联网营销 狼人:
    信息架构,互联网营销 狼人:
    产品的成功学,互联网营销 狼人:
    How Digg is Built:讲述Digg背后的技术,互联网营销 狼人:
    网站体验七武器,互联网营销 狼人:
    真正有价值的社交网络——微观下的Twitter,互联网营销 狼人:
    互联网革新的下一个受益者是谁?,互联网营销 狼人:
    Hibernate的hql常用语句整理汇总
  • 原文地址:https://www.cnblogs.com/zhuguanhao/p/2523547.html
Copyright © 2020-2023  润新知