有符号数和无符号数

1、有符号数和无符号数

1.1 signed和unsigned介绍:

        signed和unsigned用于修饰整数类型(包括char)。

        (1)、signed 表示有符号,unsigned表示无符号

        (2)、有符号数的最大取值要比无符号的小约一半,因为有符号数的最高位被用来做符号位。

        (3)、默认的short,int,long,long long为有符号数;

                换言之,short等价于signed shortint等价于signed intlong等价于signed longlong long等价于signed long long

        (4)、char本身是signed char还是unsigned char取决于编译器的实现

        (5)、不能用signed和unsigned来修饰float和double,因为它们总是带符号的。

常见的数据类型(只说明numeric类型的)如下:

Type NameBytesOther NamesRange of Values
char1
unsigned char1none0 to 255
short2

short int,

signed short int

-32768 to 32767
unsigned short2unsigned short int0 to 65535
int*

signed,

signed int

System dependent
unsigned int*unsignedSystem dependent
long4

long int,

signed long int

-2,147,483,648 to 2,147,483,647
unsigned long4unsigned long int0 to 4,294,967,295
__int81

char,

signed char

-128 to 127
__int162

short,

short int,

signed short int

-32768 to 32767
__int324

signed,

signed int

-2,147,483,648 to 2,147,483,647
__int648none

-9,223,372,036,854,775,808 to

 9,223,372,036,854,775,807

enum*noneSame as int
float4none3.4E +/- 38(7 digits)
double8none1.7E +/- 308(15 digits)
long double10none1.2E +/- 4932(19 digits)

1.2 signed和unsigned类型数据在计算机中的存储:

1.3 表达式中整数类型的转换规则

(1)、所有比signed int类型小的数据(包括signed char,unsigned char  signed short,unsigned short)转换为signed int类型。如果转换后的数据会超出signed int类型所能表示的范围的话,则转换为unsigned int类型。

(2)、bool类型转化为int类型时,false转化为0,ture转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值转化为true;

(3)、如果表达式中混有unsigned shortint类型时,如果int类型数据可以表示所有的unsigned short类型的话,则将unsigned short类型转换为int类型,否则,unsigned short类型以int类型都转换为unsigned int类型。

        举例:在32位机上,int是32位,范围-2^31 to 2^31 - 1(-2,147,483,648 to -2,147,483,647),unsigned short是16位,范围0 to 65,535。这样int类型足够表示unsigned short类型的数据,因此在混有这两者的运算中,unsigned short类型会被转换为int类型;

(4)、unsigned intlong类型的转换规律同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类型。

[例题]:

unsigned int i = 3;
cout << i * -1;

问结果是多少?

        经过以上的总结,前面提出的为问题的答案就比较明显了。在表达式i * -1中,i是unsigned int类型,-1是int类型(常量整数的类型同enum),按照第5条可知,-1必须转换为unsigned int类型,即0xffffffff,相当于十进制的4,294,967,295,然后再与3相乘,即4,294,967,295 * 3,如果不考虑溢出的话,结果是12,884,901,885,十六进制为0x2 ffff fffd,由于unsigned int只能表示32位,因此结果是0xffff fffd,即4,294,967,293。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值