程序将找到一块能够存储整数的内存,将该内存单元标记为braincount,并将5复制到该内存单元中;然后,您可在程序中使用braincount来访问该内存单元。
- int braincount{5};
- int braincount = {5};
- int braincount = 5; //存储一个整数,并使用名称braincount来表示该整数的值
可以使用sizeof()函数查看各数据类型在内存中占多少个字节
- #include
- #include
//定义了符号常量来表示类型的限制 -
- int main(void)
- {
- int n_int = INT_MAX;
- short n_short = SHRT_MAX;
- long n_long = LONG_MAX;
- long long n_llong = LLONG_MAX;
-
- //sizeof不是函数,是运算符。sizeof查看类型所占用的内存大小必须加括号,查看变量可以不加括号。
-
- cout << "int is " << sizeof(int) << " bytes." << endl;
- cout << "Maximum values: " << n_int << endl;
- cout << "short is " << sizeof n_short << " bytes." << endl;
- cout << "Maximum values: " << n_short << endl;
- cout << "long is " << sizeof(long) << " bytes." << endl;
- cout << "Maximum values: " << n_long << endl;
- cout << "long long is " << sizeof n_llong << " bytes." << endl;
- cout << "Maximum values: " << n_llong << endl;
-
- return 0;
- }
输出:
整型从最小到最大依次是:
bool、 char、 signed char、unsigned char、 short、 unsigned short、 int、 unsigned int、 long、 unsigned long以及C++11新增的long long和unsigned long long。
为什么C++有多种整型?
有多种整型类型,可以根据特定需求选择最适合的类型。 例如,可以使用short来存储空格,使用long来确保存储容量,也可以寻找可提高特定计算的速度的类型。
- int main(void)
- {
- short sam = SHRT_MAX;
- unsigned short sue = sam;
-
- cout << "short sam = SHRT_MAX;\t unsigned short sue = sam;" << endl;
- cout << "sam = " << sam << ",\t\t sue = " << sue << endl;
-
- sam = sam+1; //溢出
- sue = sue+1;
-
- cout << "sam +1 = " << sam << ",\t sue + 1 = " << sue << endl;
-
- return 0;
- }
输出:
原因:
该程序将一个short变量(sam)和一个unsigned short变量(sue)分别设置为最大的short值,在我们的系统上,是32767。然后,将这些变量的值都加1。这对于sue来说没有什么问题,因为新值仍比无符号整数的最大值小得多;但sam的值从32767变成了-32768! 同样,对于sam,将其设置为0并减去1, 也不会有问题; 但对于无符号变量sue,将其设置为0并减去后,它变成了65535。可以看出,这些整型变量的行为就像里程表。如果超越了限制,其值将为范围另一端的取值(参见图3.1)。C++确保了无符号类型的这种行为; 但C++并不保证符号整型超越限制(上溢和下溢)时不出错,而这正是当前实现中最为常见的行为。
- #include
-
- using namespace std;
-
- int main(void)
- {
- int a;
- cout << "请输入一个整数 a = ";
- cin >> a;
- cout << oct << "a 的8进制:" << a << endl;
- cout << hex << "a 的16进制:" << a << endl;
- cout << dec << "a 的10进制:" << a << endl; //默认也是十进制输出
-
- return 0;
- }
输出:
- #include
-
- using namespace std;
-
- int main(void)
- {
- char ch = 'M'; //在内存中ch是以ASCII码值77存储
- int i = ch; //并没有类型不匹配,把ch内存中的77读取出来赋给整型
-
- //cout发现ch是char类型,就把内存中的77变为对应的字符显示出来
- cout << "The ASCII code for " << ch << " is " << i << endl;
-
- ch = ch+1;
- i = ch;
-
- cout << "ch + 1 后:" << endl;
- cout << "The ASCII code for " << ch << " is " << i << endl;
-
- cout.put('M'); //通过类对象cout来使用函数put( )
- cout << endl;
- cout << 'M' << endl;
-
- return 0;
- }
输出:
如何使用C++来找出编码88表示的字符?
- char c = 88;
- cout << c << endl; // char type prints as character
- cout.put(char(88)); // put() prints char as character
- cout << char(88) << endl; // new-style type cast value to char
- cout << (char)88 << endl; // old-style type cast value to char
1、小数点的形式;例如:float a=12.345;
2、E表示法;例如:float a=1.2e-10;
C和C++对于有效位数的要求是,float至少32位,double至少48位,且不少于float,long double至少和double一样多。这三种类型的有效位数可以一样多。然而,通常,float为32位,double为64位,long double为80、96或128位。另外,这3种类型的指数范围至少是-37到37。
常量为float类型,请使用f或F后缀。对于long double类型,可使用l或L后缀(由于l看起来像数字1,因此L是更好的选择) 。
- auto b = 8.25f / 2.5; //2.5默认double,则b也是double类型。
- auto a = 12.345678L; //a默认为long double类型
-
- cout << a << endl; //输出为12.3456,因为浮点数在系统中只显示了6位有效位
- #include
-
- using namespace std;
-
- int main(void)
- {
- cout.setf(ios_base::fixed, ios_base::floatfield); //浮点数显示到小数点后六位
-
- float tub = 10.0 / 3.0;
- const float million = 1.0e6; //定义一个float类型的[常量]
-
- cout << "tub = " << tub << endl;
- cout << "A million tubs = " << tub * million << endl;
-
- double mint = 10.0 / 3.0;
- cout << "mint = " << mint << endl;
- cout << "A million mint = " << mint * million << endl;
-
- return 0;
- }
输出:
原因:
tub和mint都被初始化为10.0/3.0—3.333333333333333333……由于cout打印6位小数, 因此tub和mint都是精确的。 但当程序将每个数乘以一百万后, tub在第7个3之后就与正确的值有了误差。 tub在7位有效位上还是精确的(该系统确保float至少有6位有效位, 但这是最糟糕的情况) 。 然而, double类型的变量显示了13个3, 因此它至少有13位是精确的。 由于系统确保15位有效位, 因此这就没有什么好奇怪的了。 另外, 将tub乘以一百万, 再乘读取包含文件以10后, 得到的结果不正确, 这再一次指出了float的精度限制。
通常float为32位(二进制),float至少有6位有效位(十进制)。
例如:8.25在内存中的表示:
整数部分:1000
小数部分: 01
0.25*2=0.5 --- 0
0.5*2 =1 --- 1
8.25的二进制表示为:1000.01
8.25的二进制科学计数法表示为:1.00001*(2^3)
符号位:0(正数为0,负数为1)
指数:127(固定偏移)+3 = 130 ----> 10000010(130的二进制)
小数:00001
所以合起来8.25在内存中表示为:0 10000010 00001000000000000000000一位符号位 + 23位小数位 = 24位二进制数据位 ---> 6位十进制数据位
- #include
-
- using namespace std;
-
- int main(void)
- {
- float a = 2.34e22;
- float b = a + 1.0;
-
- cout << "a = " << a << endl;
- cout << "b = a + 1.0 = " << b << endl;
- cout << "b - a = " << b-a << endl; //=0,按理说应该=1的。但是......
-
- /*2.34E+22是一个小数点左边有23位的数字。加上1,就是在第23位加1。
- 但float类型只能表示数字中的前6位或前7位,因此修改第23位对这个值不会有任何影响。*/
-
- return 0;
- }
输出:
优先级:类似于数学运算。
以上三种方法都可以,例如:
- cout << (int) 12.6 <
//把12.6强制转换成int类型,只截取整数部分,输出12 - cout << float (12.3456789) <
//把12.3456789强制转换成float类型,四舍五入,输出12.3457
将long值赋给float变量在数值范围内会导致舍入误差。
而把浮点数赋值给整数在数值范围内只会截取整数部分,不进行四舍五入。