2.1.2Type Conversions(1/10/2017)

1.If we assign an out-of-range value to an object of unsigned type, the result is

the remainder of the value modulo
the number of values the target type can

hold. For example, an 8-bit unsigned char can hold values from 0 through

255, inclusive. If we assign a
value outside this range, the compiler assigns the

remainder of that value modulo 256.
Therefore, assigning –1 to an 8-bit

unsigned char gives that object the value 255.

2. If
we assign an out-of-range value to an object of signed type, the result is

undefined.
The program might appear to work, it might crash, or it might

produce
garbage values.

3.Advice:
Avoid Undefined and Implementation-Defined Behavior

Undefined
behavior results from errors that the compiler is not required (and

sometimes
is not able) to detect. Even if the code compiles, a program that

executes
an undefined expression is in error.

Unfortunately,
programs that contain undefined behavior can appear to

execute
correctly in some circumstances and/or on some compilers. There is

no
guarantee that the same program, compiled under a different compiler or

even
a subsequent release of the same compiler, will continue to run

correctly.
Nor is there any guarantee that what works with one set of inputs

will
work with another.

Similarly,
programs usually should avoid implementation-defined behavior,

such
as assuming that the size of an int is a fixed and known value. Such

programs
are said to be nonportable. When the program is moved to another

machine,
code that relied on implementation-defined behavior may fail.

Tracking
down these sorts of problems in previously working programs is,

mildly
put, unpleasant.

4. The
compiler applies these same type conversions when we use a value of one

arithmetic
type where a value of another arithmetic type is expected. For example,

when
we use a nonbool value as a condition (§ 1.4.1, p. 12), the arithmetic value is

converted
to bool in the same way that it would be converted if we had assigned

that
arithmetic value to a bool variable:

int i = 42;

if (i) //
condition will evaluate as true

i = 0;

If
the value is 0, then the condition is false; all other (nonzero) values yield
true.

By
the same token, when we use a bool in an arithmetic expression, its value

always
converts to either 0 or 1. As a result, using a bool in an arithmetic
expression

is
almost surely incorrect.

5. Caution:
Don’t Mix Signed and Unsigned Types

Expressions
that mix signed and unsigned values can yield surprising results

when
the signed value is negative. It is essential to remember that signed

values
are automatically converted to unsigned. For example, in an

expression
like a * b, if a is -1 and b is 1, then if both a and b are ints,

the
value is, as expected -1. However, if a is int and b is an unsigned,

then
the value of this expression depends on how many bits an int has on

the
particular machine. On our machine, this expression yields 4294967295

6.2的32次方是4294967296

7.

unsigned
u = 10, u2 = 42;

std::cout
<< u2 - u << std::endl;//32

std::cout
<< u - u2 << std::endl;//4294967264

int
i = 10, i2 = 42;

std::cout
<< i2 - i << std::endl;//32

std::cout
<< i - i2 << std::endl;//-32

std::cout
<< i - u << std::endl;//0

std::cout <<
u - i << std::endl;//0

2.1.3literals

1.

Although
integer literals may be stored in signed types, technically speaking, the

value
of a decimal literal is never a negative number. If we write what appears to be

a
negative decimal literal, for example, -42, the minus sign is not part of the
literal.

The
minus sign is an operator that negates the value of its (literal) operand.

2.

3. The
type of a string literal is array of constant chars, a type we’ll discuss in §
3.5.4

(p.
122). The compiler appends a null character (’\0’) to every string literal.
Thus, the

actual
size of a string literal is one more than its apparent size. For example, the

literal
'A' represents the single character A, whereas the string literal "A"
represents

an
array of two characters, the letter A and the null character.

4. Two
string literals that appear adjacent to one another and that are separated only

by
spaces, tabs, or newlines are concatenated into a single literal. We use this
form of

literal
when we need to write a literal that would otherwise be too large to fit

comfortably
on a single line:

// multiline
string literal

std::cout <<
"a really, really long string literal "

"that spans
two lines" << std::endl;

学习笔记(C++Primer)--易错点总结(Chapter2)的更多相关文章

  1. ref:学习笔记 UpdateXml() MYSQL显错注入

    ref:https://www.cnblogs.com/MiWhite/p/6228491.html 学习笔记 UpdateXml() MYSQL显错注入 在学习之前,需要先了解 UpdateXml( ...

  2. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...

  3. 学习笔记 UpdateXml() MYSQL显错注入

    在学习之前,需要先了解 UpdateXml() . UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是Stri ...

  4. TensorFlow学习笔记(MNIST报错修正 适用Tensorflow1.3)

    在Tensorflow实战Google框架下的深度学习这本书的MNIST的图像识别例子中,每次都要报错   错误如下: Only call `sparse_softmax_cross_entropy_ ...

  5. 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...

  6. python学习笔记-import utils报错

    今天遇到一个坑爹的问题,查找了半天原因,终于解决了,在此特地记录一下. 运行环境:Windows eclipse 我在eclipse中配置了python的运行环境,在eclipse中编写python代 ...

  7. Java学习笔记之Scanner报错java.util.NoSuchElementException

    转载自:IT学习者-螃蟹 一个方法A使用了Scanner,在里面把它关闭了.然后又在方法B里调用方法A之后就不能再用Scanner了Scanner in = new Scanner(System.in ...

  8. 学习笔记71—Python 报错处理集

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  9. 关于java学习中的一些易错点(基础篇)

    由JVM来负责Java程序在该系统中的运行,不同的操作系统需要安装不同的JVM,这样Java程序只需要跟JVM打交道,底层的操作由JVM去执行. JRE(Java Runtime Environmen ...

  10. ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢

    <!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...

随机推荐

  1. 简单动态规划——三逆数的O(N^2)解法!

    [算法]简单动态规划——三逆数的O(N^2)解法! 问题描述: 三逆数定义:给一个数的序列A[0,1,....N-1]),当i<j<k且A[i]>A[j]>A[k]时,称作ai ...

  2. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...

  3. vmstat命令查看系统资源占用情况

    vmstat是一个十分有用的Linux系统监控工具,使用vmstat命令可以得到关于进程.内存.内存分页.堵塞IO.traps及CPU活动的信息.可用以下命令查看: # vmstat 2 直接查看系统 ...

  4. 读取的XML节点中带有冒号怎么办?

    读取的XML节点中带有冒号怎么办? 昨天,编程读取XML的时候,遇上了类似下面的一段XML <a:root xmlns:a="http://ww.abc.com/"> ...

  5. PostgreSQL 简明使用说明

    原文地址:http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html 期间,作者有写错的地方,已经做更改了. ...

  6. linux 原生系统发送电子邮件 (在本地与因特网)

    有用的资料在 Linux mail 命令 http://www.cnblogs.com/JemBai/archive/2012/01/24/2329136.html 还有这里 Linux系统下mail ...

  7. C++ 全局构造函数调用的顺序

    C++的全局类和静态类的构造函数是在main函数之前调用的.但是,不同的类的构造函数以什么顺序调用呢? 对于g++编译器来说,这个顺序是由链接时,文件顺序决定的. 我们用一个例子来说明这一点. 我们有 ...

  8. .NET基础——ASSCII码表

    char类型不能直接强转为int32,因为强转后的结果是去ascii码表的值.如char 类型的1,强转为int32后的值是49. 要得到正确的结果,现将char类型转换为string类型,再转为in ...

  9. pb_ds(平板电视)整理

    有人说BZOJ3040用普通的<queue>中priority_queue搞dijkstra过不了. 我只想说你们的djk可能写的太丑了. 先上代码 #include<iostrea ...

  10. Linux实战教学笔记09:通配符

    第九节 通配符 标签(空格分隔): Linux实战教学笔记 ---更多详细资料请点我查看 第1章 回顾特殊符号 | #管道符,或者(正则) > #输出重定向 >> #输出追加重定向 ...