从零单排《C++ Primer》
——(3)重要的基本类型
算数类型(Arithmetic Types)c++算数类型
TypeMeaningMinimum Size
wchar_t用来保证有足够的大小去保存扩展字符集。char16_t和char32_t用语Unicode 字符集。
一般而言,short类型为半个机器字(word)长,int类型为一个机器字长,而long类型为一个或两个机器字长(在32位机器中,long类型和int类型的字长通常是相同的)。
一般而言,float类型为一个机器子长,double类型为两个机器子长。long double类型为三或四个机器字长。float能表示7位有效数字,double能表示16位有效数字。
除了bool和extended character types(wchar_t)的intergral type(int,short,long,long long)可以是有符号的和无符号的。用unsigned 类型 表示无符号。例如unsigned int。
类型使用建议:
1)如果值不能是负的,使用无符号类型。
2)使用int或long long(如果超过了int 表示的范围)来进行整形计算。
3) 不要使用plain char 或者 bool来进行算数运算。只用它们来保存值。用位根据不同的编译器,plain char可能是有符号的或无符号的。char有三种(plain) char,signed char,unsigned char。
4)一般而言,使用Double来进行浮点数计算。
问:
int,long,long long,short有什么不同?unsigned,signed有什么不同?float和double有什么不同?
答:
short类型为半个机器字(word)长,int类型为一个机器字长,而long类型为一个或两个机器字长(在32位机器中,long类型和int类型的字长通常是相同的)。
unsigned为无符号数,signed为有符号数。表示范围不同。
float类型为一个机器子长,double类型为两个机器子长。表示的有效数据为不同。float为6位,double为10位。
问:
为了计算货代支付,利息,本金和支付金额你会用什么类型?
答:使用Double。
赋值时的类型转换
bool b = 42; // b is true
int i = b; // i has value 1
i = 3.14; // i has value 3
double pi = i; // pi has value 3.0
unsigned char c = -1; //assunming 8-bit chars,c has value 255
signed char c2 = 256; //assuming 8-bit chars,the value of c2 is undefined
1)当给bool赋值时,如果为赋值为0,bool为flase,否则位true。
2)把bool赋值给其他算数类型时,true为1,false为0。
3)当把浮点型赋值给integral类型时,保存的是小数点前面的部分。
4)如果把integral类型部分赋值给浮点类型,分数部分是0。
6)当我们给带符号类型赋一个超出它表示范围的值时,结果是未定义的。
无符号类型运算
当使用unsigned和int进行算数运算的时候,int会自动转为unsigned。
unsigned u = 10;int i = -42;std::cout<<i + i <<std::endl;//prints -84std::cout<<u + i <<std::endl;//if 32-bit,prints 4294967264
无论是一个还是两个无符号数,相减时要保证结果大于0。
unsigned = 42, u= 10;std::cout<<u1 – u2 <<std::endl;//ok result is 32std::cout<<u2 – 21 <<std::endl; // ok but the result will wrap around//WRONG:u can never be less than 0;for(unsigned u = 10; u>=0; –u)std::cout<< u << std::endl;因此,最好不要把无符号数和有符号数混用。
作业:p38
Exercise 2.3:#include<iostream>int main(){unsigned u = 10, u2 = 42;std::cout<<u2 – u <<std::endl; //32std::cout<<u – u2 <<std::endl; //<span style="font-family: Arial, Helvetica, sans-serif;">4294967264</span>int i = 10, i2 = 42;std::cout<< i2 – i <<std::endl; //32std::cout<< i – i2<<std::endl; //-32std::cout<< i – u <<std::endl; //0std::cout << u – i<<std::endl; //0return 0;}字面值
如42,它就是字面值,每个字面值都有一个类型。
integer 和 浮点型字面值
integer:
可以使用十进制,八进制,十六进制表示。
20/* decimal */024 /* octal*/0x14 /* hexadecimal */浮点型:3.14159 3.14159E0 0. 0e0 .001字符和字符串字面值:'a' //字符字面值"Hello World!" 字符串字面值编译器会在每个字符串字面值的后面追加一个null字符(’\0′)。
字符串可以如下连接:
转义字符:
1)
newline \n horizontal tab \t alert(bell) \a vertical tab \v backspace \b double quote \&;
backslash \\ question mark \? single quote \’ carriage return r formfeed f
2)
数字表示形式
12(newline) 40 (blank) x4d(‘M’)
后面跟着最多3个8进制数字,否则将被拆分。如1234 会分成123和4
字面值类型可以覆盖
Character and Character String Literals
Integer Literals
SuffixMinimum Type
u or Uunsigned
l or Llong
ll or LLlong long
Floating-Point Literals
SuffixType
f or Ffloat
l or Llong double
Bool 字面值
true,false
,当你能梦的时候就不要放弃梦