《C++ Primer》第2章 2.1节习题答案

2.1 基本内置内型。

 

练习1:类型int, long, long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?

【解答】

在C++语言中,int, long,long long和short都属于整型,区别是C++标准规定的尺寸的最小值(即该类型在内存中所占的比特数)不同。其中short是短整型,占16位;int是整型,占32位,long和long long均为长整型,分别占32位和64位。C++标准允许不同的编译器赋予这些类型更大的尺寸。某一类型占的比特数不同,它所能表示的数据范围也不一样。

大多数整型都可以划分为无符号类型和带符号类型,在无符号类型中所有比特都用来存储数值,但是仅能表示大于等于0的值;带符号类型则可以表示正数、负数或0.

float和double分别是单精度浮点数和双精度浮点数,区别主要是在内存中所占的比特数不同,以及默认规定的有效位数不同。

#include <iostream>

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "bool is size = " << sizeof(bool) << std::endl;
    std::cout << "char is size = " << sizeof(char) << std::endl;
    std::cout << "char min value = " << SCHAR_MIN << std::endl;
    std::cout << "char max value = " << SCHAR_MAX << std::endl;
    std::cout << "uchar max value = " << UCHAR_MAX << std::endl;
    
    std::cout << "short is size = " << sizeof(short) << std::endl;
    std::cout << "short min value = " << SHRT_MIN << std::endl;
    std::cout << "char max value = " << SHRT_MAX << std::endl;
    std::cout << "uchar max value = " << USHRT_MAX << std::endl;
    
    std::cout << "int is size = " << sizeof(int) << std::endl;
    std::cout << "int min value = " << INT_MIN << std::endl;
    std::cout << "int max value = " << INT_MAX << std::endl;
    std::cout << "uint max value = " << UINT_MAX << std::endl;
    
    std::cout << "long is size = " << sizeof(long) << std::endl;
    std::cout << "long min value = " << LONG_MIN << std::endl;
    std::cout << "long max value = " << LONG_MAX << std::endl;
    std::cout << "ulong max value = " << ULONG_MAX << std::endl;
    
    std::cout << "long long is size = " << sizeof(long long) << std::endl;
    std::cout << "long long min value = " << LLONG_MIN << std::endl;
    std::cout << "long long max value = " << LLONG_MAX << std::endl;
    std::cout << "uclong long max value = " << ULLONG_MAX << std::endl;
    
    std::cout << "float is size = " << sizeof(float) << std::endl;
    
    std::cout << "double is size = " << sizeof(double) << std::endl;
    
    std::cout << "long double is size = " << sizeof(long double) << std::endl;
    
    return 0;
}

练习2:计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。

【解答】

在实际应用中,利率、本金和付款既可能是整数,也有可能是普通的实数。因此应该选择一种浮点类型来表示。在三种可供选择的浮点类型float、double和long double中,double和float的计算代价比较接近且表示范围更广,long double的计算代价则相对较大,一般情况下淌有选择的必要。综合以上分析,选择double是比较恰当的。

 

练习3:读程序写结果。

输出结果:
32
4294967264
32
-32
0
0

u和u2都是无符号整数,因此u2-u得到了正确的结果(42-10 = 32);u - u2也能正确计算,但是因为直接计算的结果是-32,所以在表示为无符号整数时自动加上模,在作者的编译环境中int占32位,因此加模的结果是4294967264.

i和i2都是带符号整数,因此中间两个式子的结果比较直观,42-10=32,10-42= -32.

在最后两个式子中,u和i分别是无符号整数和带符号整数,计算时编译器先把带符号数转换为无符号数,幸运的是,i本身是一个正数,因此转换后不会出现异常情况,两个式子的计算结果都是0.

 

练习4:编写程序检查你的估计是否正确,如果不正确,请仔细研读本节直到弄明白问题所在。

#include <iostream>

int main()
{
    
    unsigned u = 10, u2 = 42;
    std::cout << u2 - u << std::endl;
    std::cout << u - u2 << std::endl;
    
    int i = 10, i2 = 42;
    std::cout << i2 - i << std::endl;
    std::cout << i - i2 << std::endl;
    std::cout << i - u << std::endl;
    std::cout << u - i << std::endl;
    
    return 0;
}

练习5:指出下述字面值的数据类型并说明每一组内几种字面值的区别:

(a) 'a', L'a', "a", L"a"

(b) 10, 10u, 10L, 10uL, 012, 0xC

(c) 3.14, 3.14f, 3.14L

(d) 10, 10u, 10., 10e-2

【解答】

(a) 'a'表示字符a, L'a'表示宽字符型字面值a且类型是wchar_t, "a"表示字符串a, L"a"表示宽字符型字符串a。

(b) 10是一个普通的整数类型字面值, 10u表示一个无符号数, 10L表示一个长整型数, 10uL表示一个无符号长整型数, 012是一个八进制数(对应的十进制数是10), 0xC是一个十六进制数(对应的十进制数是12)。

(c) 3.14是一个普通浮点类型字面值, 3.14f表示一个float类型的单精度浮点数, 3.14L表示一个long double类型的扩展精度浮点数。

(d) 10是一个整数, 10u是一个无符号整数, 10.是一个浮点数, 10e-2是一个科学计数法表示的浮点数,大小为10*10-2 = 0.1.

 

练习6:下面两组定义是否有区别,如果有,请叙述之:

int month = 9, day = 7;

int month = 09, day = 07;

【解答】

第一组定义是正确的,定义了两个十进制数9和7.

第二组定义是错误的,编译时将报错。因为以0开头的数是八进制数,而数字9显然超出了八进制数能表示的范围,所以第二组定义无法被编译通过。

 

练习7:下述字面值表示何种含义?它们各自的 数据类型是什么?

(a) "Who goes with F\145rgus?\012"

(b) 3.14e1L    (c)1024f    (d) 3.14L

【解答】

(a)是一个字符串,包含两个转义字符,其中\145表示字符e,\012表示一个换行符,因此该字符串的输出结果是Who goes with Fergus?

(b)是一个科学计数法表示的扩展精度浮点数,大小为3.14*101=3.14。

(c)试图表示一个单精度浮点数,但是该形式在某些编译器中将报错,因为后缀f直接跟在整数1024后;改写成1024.f就可以了。

(d)是一个扩展精度浮点数,类型是long double,大小为3.14。

 

练习8:请利用转义字符编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。

#include <iostream>

int main()
{
    std::cout << "Who goes with F\145rgus?\012";
    std::cout << "2\x4d\012";
    std::cout << "2\tM\n";
    
    return 0;
}

主函数的前面两行分别实出了题目中要求的两种输出形式。

其中,字符串“2\x4d\012”先输出字符2,紧接着利用转义字符\x4d输出字符M,最后利用转义字符\012转到新一行。

字符串“2\tM\n”先输出字符2,然后利用转义字符\t输出一个制表符,接着输出字符M,最后利用转义字符\n转到新一行。

输出同一个字符有多种方式可供选择。例如,可以直接输出字符M,也可以通过转义字符x4d输出字符M:可以用转义字符\012换行,也可以用转义字符\n换行。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值