您的位置:首页 > 编程语言 > C语言/C++

c++学习笔记:变量

2015-06-20 22:32 381 查看
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就是它的字面值。

  指针字面值(稍后会说)。

注意:关于求补码的问题可以查阅相关资料,资料会讲解不同数制的补码求法。

  

    

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: