C++进阶教程(含C++11)(1)变量与基本类型1

1、C++中的基本类型


类型                                含义                                大小(bit)

bool                              布尔类型                            未定义

char                                字符                                     8

wchar_t                         宽字符                                  16

char16_t                      Unicode                                 16

char32_t                      Unicode                                 32

short                             短整形                                  16

int                                   整形                                    16/32

long                              长整形                                  32/64

long long                    超长整形(C++11)                    64/128

float                           单精度浮点                              32      6位有效数字

double                       双精度浮点                              64       10位有效数字

long double             长双精度浮点                           96/128    10位有效数字


一个int至少和一个short一样大,一个long至少和int一样大,一个long long至少和一个long一样大,long long是C++11新定义的整数类型。


一般来说,float和double分别有7位和16个有效位,long double通常用于浮点需求的硬件,具体实现不同,精度也会不同。


2、有符号和无符号

除了bool和扩展性字符型(除了char类型的字符型),其他整形可以通过unsigned关键字派生出无符号类型。

例如 unsigned int,unsigned long。其中unsigned int可以缩写为unsigned。

有符号整形的取值为负数,0,正数。

无符号整形的取值为0,正数。无符号由于没有符号位,所以无符号整形可以表示更大的数。


【你造吗?】

【与整形不同,字符型分成了char,unsigned char,signed char三种。特别需要注意的是char和signed char并不一样。虽然字符型有三种,但是字符的表现形式只有两种:有符号,无符号。char实际上表现为哪一种,要依赖于编译器。C++标准并没还有规定char应该如何表示,但是约定了在表示范围内正数和负数应该平衡。因此signed char理论上可以表示-127到127之间的数。通常计算机会将表示范围定位-128到127。】


【学着点!】

【1、当明确得知数值不为负数时,请用无符号类型】

【2、尽量使用int计算,long往往太大,short往往太小,如果你的范围超过了int,更建议用long long】

【3、算数的时候不要用char和bool,有些机器上char是有符号的,有些机器上是无符号的,所以char特别不稳定,但是如果你迫切想使用它来表示一个很小的数,请明确指出是signed char还是unsigned char。】

【4、运算小数的时候尽量用double,float往往会丢失精度,而float和double的运算效率相差无几。而long double一般情况是不会用到的,而它的效率往往不行。】


2、基本类型的类型转换

当我们讲一种类型赋值给另一种类型的时候,系统自动会进行转换。


例如:

bool b = 42;       //b为真

int i = b;            //i为1

i = 3.14;            //i为3

double pi = i;     //pi为3.0

unsigned char c = -1; //c为255

signed char c2 = 256; //c2的值为未定义


由上可知:

1、如果把非bool类型的值赋给bool类型,0为false,非0为true;

2、如果把bool类型赋值给非bool类型,true为1,false为0;

3、如果把小数赋给整数类型,结果只保留整数部分;

4、如果把整数赋给小数,小数位为0;

5、如果给无符号类型赋值负数,结果为对无符号表示范围的总数取模。

比如 unsigned char表示范围是0-255,赋值-1就是-1对256取模,得出255。

6、如果赋值的值超出了类型的表示范围,结果是未定义的,程序可能继续工作,可能崩溃,也可能产生垃圾数据。有些编译器会按照5的方式来解决。


把非bool类型放入if条件中,会自动讲该值转换成bool值进行判断。

int a = 3;

if(a)

{

  //a非0,结果为true


我们也可以讲表达式放入if语句中,例如

if(a-3)

{

}


虽然可以如此做,但是尽量不要,这样会让程序的可读性变差。


3、含有无符号类型的表达式

尽管我们不会故意给无符号对象赋一个负值,但是实际中可能经常无意这么干。

例如,一个算术表达式中既有无符号又有int,那么int会变成无符号。把int转换成无符号数的过程和把int直接赋给无符号变量一样。

usigned u = 10;

int i = -42;

i + i;      //结果为-84

i + u;     //结果为4294967264,并不是你想要的-32

在i+u运算时,会把int转换成无符号数,那么结果就是-42对int表示的数的数量取模


当无符号数中减去一个值,不管这个值是不是无符号数,我们都要确保结果不能为负

unsigned u1=42,u2=10;

u1 - u2;  //32

u2 - u1;  //为4294967264


我们如果写一个输出10到0的数,我们会这么写

for (int i = 10; i >= 0;--i)

     std::cout << i << endl;


可能你会觉得,反正不会输出负数,那么干脆用无符号来弄吧,于是就有了下面的写法

for (unsigned i = 10; i >= 0;--i)

     std::cout << i << endl;

然后这个结果,绝对不是你想要的,因为它是死循环。

当i为0时,最后执行--i,本来i应该为-1,但是由于它是无符号数,最后又模回来了,结果就成了很大的数,所以永远不会满足跳出的条件。

对于这种情况,有一个解决办法,用while代替for

unsigned u = 11;

while( u > 0 )

{

     --u;

     std::cout << u <<endl;

}


【切记】

【最好不要将有符号和无符号同时加入表达式中,这样很容易出错,比如a*b,a=-1,b=1,从表达式的角度看,显然结果是-1,但是如果a是int,b是unsigned,那么结果就是4294967295】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值