变量和基本类型之第一篇:基本内置类型和变量
一、
(1)
C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16_t,Unicode字符char32_t,短整型short(int),
整形int,长整形long(int),长整形long long(int),单精度浮点型float,双精度浮点型double,扩展精度浮点数long double。
其中,wchar_t、char16_t、char32_t用于扩展字符集。wchar_t确保可以存放机器最大扩展字符集中的任意一个字符,类型char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中字符的标准)。
对于整形,C++语言规定:一个int至少应该和short int一样大,一个long应该至少和int一样大(在32位的机器上两者通常是一样大的),一个long long int至少和一个long一样大(long long int 是在C++ 11中新定义的)。
内置类型的机器实现:
计算机以比特序列存储数据,每个比特非0即1。大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为"字节(byte)",存储的基本单元称为"字(word)",通常有几个字节组成。C++中,一个字要至少能容纳机器基本字符集中的字符。大多数机器的字节由8个比特组成,字则由4个字节或8个字节组成。计算机将内存中的每个字节与一个数字(地址)关联起来。
浮点型可表示单精度、双精度和扩展精度值,C++标准定义了一个浮点数的有效位数的最小值。通常,float以1个字节(32byte)来表示,double以两个字来表示,long double以3个或4个字来表示。float和double分别有7个和16个有效位。
(2)类型转换
把其他类型的值转换为bool值的时候,当值为0时bool为false,当值不为0时bool等于true;把一个bool值转换为整型时,true被翻译为1,false被翻译为0;把浮点数赋值给整形时,仅保留小数点之前的值;把一个整型值赋值给浮点型时,小数部分记0;当给一个无符号类型赋值一个超出它表示的类型时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,unsigned char可以表示0~255区间的值,如果把-1赋值给一个unsigned char类型变量,则实际的结果时该值对256取模后的余数,为255。
例如:
unsigned u = 10;
int i = 42; // 输出84
std::cout << i + i << std::endl; // 如果int占32位,输出4294968264
std::cout << u + i << std::endl;
在第一个输出表达式里,两个负整数类型一样,相加得到了期望的结果,而第二个表达式在相加前,先把整型-42转换为无符号数,把负数转换成无符号数结果等于这个负数加上这个无符号数的模。
另外,当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须保证结果是一个无符号数。
二、字面值常量
每个字面值常量都对应了一种数据类型。
这三个数分别用十进制、八进制和十六进制来表示了整型字面值常量20:
20 /* 十进制 */ 024 /* 八进制 */ 0x14 /* 十六进制 */
对于浮点型字面值常量,默认为double型。
'a'
/* 字符字面值 */
"a"
/* 字符串字面值 */
字符串字面值的类型实际上是由常量字符构成的数组,字符串由'\0'结尾,因此数组的长度也要至少比字符串字面值的长度大1。
std::cout << "hello world"
"I love you"
<< std::endl;
另外,字符串字面值可以分多行书写,如果两个字符串字面值位置紧邻且仅有空格、缩进和换行符分隔,则它们实际上是一个整体。
我们还可以指定字面值类型,比如:L‘a’ /* 宽字符字面值 */
三、变量
C++在定义变量时赋值叫初始化,在定义之后再赋值才算真正的赋值,所以赋值和初始化并不一样。初始化的含义是创建变量是赋予其一个初始值,而赋值的含义是把对象的当前的值擦除,用一个新值来替代。
C++初始化方式:
inthello
=0;
inthello
={0};
int hello(0);
int hello{0};
最后一种是C++11的新标准,列表初始化。
默认初始化:
定义在函数内部、块内部的内置变量,不予以默认初始化,定义在全局中的变量被默认初始化为0。
变量可以声明多次,但只能被定义一次。
extern int i; // 声明i而非定义i
int j;// 声明j并定义j
通常,我们在第一次使用变量的地方再定义它是一种比较好的选择。