《C++ Primer Plus》读书笔记之——处理数据

  本文旨在记录在阅读《C++ Primer Plus》第五版的过程中,一些重点的知识点,方便以后查阅。本文将不断更新......

一、第三章 处理数据

  1、无符号整型不能存储负数值,其优点是可以增大变量能够存储的最大值。例如short表示的范围是-32768-32767,则无符号版本的表示范围为0-65535;假设有一个short变量sam和一个unsigned short变量sue,分别设置为最大的short值,比如是32767,然后将两个变量都加1,这对于sue没有问题,但sam的值从32767变为-32768!同样,对于sam,将其值设置为0再减去1,也不会有问题;但对于sue,将其值设置为0将去1后,它变为65535!

需要注意:

string str = "123456";

if (-1 < str.size())
    cout << "win\n";
else
    cout << "lose\n";

你的答案是 win,是么?那么很遗憾的告诉你,NO,答案是;lose!!!

为何?其实很简单的问题,类型不一致。

-1 默认为intsize()返回类型为size_tunsigned int

1 size_t x = 1;
2 int y = -1;
3 cout << x + y << endl;               // 0 (-1会变成nusigned int所能表示的最大整数,加上1之后,变成0)
4 cout << typeid(x+y).name() << endl;  // unsigned int

两种类型进行操作,int 类型的 - 1 会被自动转为unsigned int,即:

1          (unsigned int) + -1         (int)
  0000...0001(unsigned int) + 1111...1111(int)
= 0000...0001(unsigned int) + 1111...1111(unsigned int)
= 0000...0000(unsigned int)

显而易见,int 类型的 - 1 转为 unsigned int 后,会变成一个非常大的正数。

  2、C++有11种整型和3种浮点类型,因此计算机会处理大量不同的情况,尤其是对不同的类型进行运算时。为处理这种潜在的混乱,C++自动执行很多类型转换:

①赋值时进行的转换:C++允许将一种类型的值赋给另一种类型的变量。这样做时,值将被转换为接收变量的类型。将一个值赋给取值范围更大的类型通常不会导致什么问题,但是相反,则可能会带来麻烦,比如降低精度等。

②表达式中的转换:当运算涉及到两种类型时,较小的类型将转换为较大的类型。例如:9.0/5,由于9.0的类型为double,因此程序在用5除之前,将5转化成double类型。

③传递参数时的转化:传递参数时的类型转化通常由C++函数原型控制。

④强制类型转化:C++允许通过强制类型转换机制显示地进行类型转换。强制类型转换的格式有两种:

 (typeName) value    C语言

 typeName (value) C++语言,新格式的想法是,要让强制类型转换就像是函数调用。

 

posted @ 2018-03-01 14:49  ~君莫笑~  阅读(637)  评论(0编辑  收藏  举报