c++学习笔记:变量(2)
先说明一下上一篇博文中的一个问题:char、signed char、unsigned char 这三者到底是怎么回事。
signed char与unsigned char 是明确的拥有含义的,也就是说当定义了一个signed char那么这个char一定是有符号的整数类型。而当定义了一个unsigned char时这个char是明确无符号的整数类型。但是char却不一定了,它的行为依靠具体的实现。(“普通char究竟是有符号还是无符号,此事由实现确定。这也可能导致出现讨厌的,令人诧异的和依赖实现的情况”----斯特劳斯特卢普《c++程序设计语言》)。signed char与unsigned char更加精确但是适用的范围可能较少。
一、类型转换。
类型转换是一种绝大多数类型都支持的运算,它的功能就是把一个类型的对象转换为另一个类型的对象。自动的类型转换经常发生,但是名字与它相近的“强制类型转换”就不那么受欢迎了(设计不良的标志)。
常见内置基本类型的类型转换:1、bool类型转换为非bool类型,false转换为0而true转换为1。但是当转换方向反过来时,非零值转换为true而零值转换为false。
2、浮点数转换为整数时会去掉小数部分,保留整数部分。
3、把整数赋给浮点数,在整数部分后面补0。
4、当赋给带符号数的之超出范围,行为未定义。
无符号与带符号之间的关系:
从下面的例子看出,int先转换成了unsigned int了,假设一个值为负数的int转换为unsigned int时,就要取补码来解决。
#include<iostream> using namespace std; int main() { unsigned u=10; int i=-42; cout<<i+i<<endl;//-84 cout<<u+i<<endl;//32位下 4294。。。。。 return 0; }
一个int如何求补码?比如int -1转换成unsigned int?首先把-1区绝对值(1)。把1按32位二进制展开 00000000 00000000 00000000 00000001
按位求反 11111111 11111111 11111111 11111110 而后把这个值加1。。。。。。果然大的离谱啊。
unsigned int 与int之间的微妙关系有时显得极重要
一下代码描述了一个死循,当i=0时在减一。由于i是一个无符号整数,i被转换成一个极大的整数,根本停不下来。
#include<iostream> using namespace std; int main() { for(unsigned i=10;i>=0;--i) { /*.......*/ } }
二、字面值(文字值)常量
何谓字面值(文字值)?如果一个值“一望便知”,那它就是一个字面值常量。
整数与浮点数字面值:20(十进制)、o24(八进制)、0x24(十六进制)
3.14、3.14E0、0.、0e0、.001都是合法的常量。
字符与字符串字面值常量:‘a’这就是字符字面值常量。而“asdfg”就是字符串字面值常量,字符串字面值常量的更多内容之后会介绍。
转义序列:查看ASCII码表,会发现有一些不可打印的字符比如“退格”他们没有可视图符。而另一类就是“转义序列”。转义序列有\n(换行)、\t(水平制表符)等等。它们均以“\”开头,两个被当成一个字符。具体的意义可以查阅ASCII码表。需要注意的是"\"后面还可以接以x开头的十六进制数字或最多三个的八进制数字。\n为换行符\12同样是换行符。
bool字面值:true与false就是它的字面值。
指针字面值(稍后会说)。
注意:关于求补码的问题可以查阅相关资料,资料会讲解不同数制的补码求法。