2月10日习题
![](https://i-blog.csdnimg.cn/direct/539a41db062d4a9bbb12614bc133633c.png)
常见数据类型字节长度介绍
在 C++ 中,不同数据类型所占用的字节长度因编译器和操作系统的不同而有所差异,但在常见的 32 位和 64 位系统中,有相对固定的大小规律。以下是按照常见情况下数据类型字节长度从小到大的排序,并给出相应示例代码验证:
常见数据类型及字节长度
bool
:通常占用 1 个字节,用于表示布尔值(true
或false
)。char
:通常占用 1 个字节,用于存储单个字符。short
(short int
):通常占用 2 个字节,用于存储较小范围的整数。int
:在 32 位系统中通常占用 4 个字节,在 64 位系统中一般也占用 4 个字节,用于存储整数。long
(long int
):在 32 位系统中通常占用 4 个字节,在 64 位系统中通常占用 8 个字节,用于存储较大范围的整数。long long
(long long int
):通常占用 8 个字节,用于存储更大范围的整数。float
:通常占用 4 个字节,用于存储单精度浮点数。double
:通常占用 8 个字节,用于存储双精度浮点数。long double
:其大小因编译器而异,一般大于等于 8 个字节,用于存储更高精度的浮点数。
示例代码
cpp
#include <iostream>
#include <iomanip>
int main() {
std::cout << std::left << std::setw(15) << "数据类型" << std::setw(10) << "字节长度" << std::endl;
std::cout << std::setfill('-') << std::setw(25) << "" << std::endl;
std::cout << std::setfill(' ');
std::cout << std::left << std::setw(15) << "bool" << std::setw(10) << sizeof(bool) << std::endl;
std::cout << std::left << std::setw(15) << "char" << std::setw(10) << sizeof(char) << std::endl;
std::cout << std::left << std::setw(15) << "short" << std::setw(10) << sizeof(short) << std::endl;
std::cout << std::left << std::setw(15) << "int" << std::setw(10) << sizeof(int) << std::endl;
std::cout << std::left << std::setw(15) << "long" << std::setw(10) << sizeof(long) << std::endl;
std::cout << std::left << std::setw(15) << "long long" << std::setw(10) << sizeof(long long) << std::endl;
std::cout << std::left << std::setw(15) << "float" << std::setw(10) << sizeof(float) << std::endl;
std::cout << std::left << std::setw(15) << "double" << std::setw(10) << sizeof(double) << std::endl;
std::cout << std::left << std::setw(15) << "long double" << std::setw(10) << sizeof(long double) << std::endl;
return 0;
}
代码解释
std::setw
和std::left
:用于格式化输出,使表格更加整齐。sizeof
运算符:用于获取数据类型的字节长度。- 输出结果:程序会输出每个数据类型及其对应的字节长度。
从上面题衍生出的解法题:在 C++ 中,要计算 99999
除以几次 10
结果为 0
,可以通过循环不断地将这个数除以 10
,同时记录除法操作的次数,直到结果为 0
为止。以下是实现该功能的示例代码:
cpp
#include <iostream>
int main() {
int num = 99999;
int count = 0;
// 循环进行除法操作,直到结果为 0
while (num != 0) {
num /= 10;
count++;
}
std::cout << "99999 除以 " << count << " 次 10 结果为 0。" << std::endl;
return 0;
}
代码解释:
-
初始化变量:
num
初始化为99999
,表示要进行除法操作的数。count
初始化为0
,用于记录除法操作的次数。
-
循环操作:
- 使用
while
循环,只要num
不等于0
,就继续执行循环体。 - 在循环体中,将
num
除以10
,并将结果重新赋值给num
。 - 每次执行除法操作后,
count
的值加1
。
- 使用
-
输出结果:
- 当
num
等于0
时,循环结束,输出99999
除以10
的次数。
- 当
下列表达式结果为true的是( )。 'z' == 'Z' 'z' < 'Z' '9' > 'Z' 'c' +1> 'D'
分享
本题可根据字符在 ASCII 码表中的值来判断各个表达式的结果。
ASCII 码表相关知识
在 ASCII 码表中,字符都对应着一个唯一的整数值。其中,大写字母 A - Z
的 ASCII 码值范围是 65 - 90,小写字母 a - z
的 ASCII 码值范围是 97 - 122,数字字符 0 - 9
的 ASCII 码值范围是 48 - 57。
对各选项进行分析
选项一:'z' == 'Z'
在 ASCII 码表中,'z'
的 ASCII 码值是 122,'Z'
的 ASCII 码值是 90,二者不相等,所以 'z' == 'Z'
的结果为 false
。
选项二:'z' < 'Z'
由于 'z'
的 ASCII 码值 122 大于 'Z'
的 ASCII 码值 90,所以 'z' < 'Z'
的结果为 false
。
选项三:'9' > 'Z'
'9'
的 ASCII 码值是 57,'Z'
的 ASCII 码值是 90,57 小于 90,即 '9'
的 ASCII 码值小于 'Z'
的 ASCII 码值,所以 '9' > 'Z'
的结果为 false
。
选项四:'c' + 1 > 'D'
'c'
的 ASCII 码值是 99,'c' + 1
即 99 + 1 = 100
;'D'
的 ASCII 码值是 68。因为 100 大于 68,所以 'c' + 1 > 'D'
的结果为 true
。
综上,答案是 'c' + 1 > 'D'
。
本题可根据数组和指针的相关知识,对每个选项进行分析。
题干分析
已知定义 int a[5], *p = a;
,这里定义了一个包含 5 个整数的数组 a
,同时定义了一个整型指针 p
,并将数组 a
的首地址赋给了指针 p
。在 C++ 中,数组名在大多数情况下会隐式转换为指向其首元素的指针,所以 p
指向数组 a
的第一个元素 a[0]
。
选项分析
- 选项 A:
*&a[5]
在 C++ 中,数组的下标是从 0 开始的。对于数组a[5]
,其有效的下标范围是 0 到 4。a[5]
已经越界,因为它试图访问数组a
的第 6 个元素,而该数组只有 5 个元素。&a[5]
是取越界元素的地址,再对这个越界地址进行解引用*&a[5]
会导致未定义行为,所以该选项错误。 - 选项 B:
a + 2
数组名a
在表达式中会隐式转换为指向数组首元素的指针。a + 2
表示的是一个地址,它指向数组a
中第 3 个元素(因为指针的偏移是以其所指向的数据类型的大小为单位的),而不是对数组元素的引用,所以该选项错误。 - 选项 C:
*(p + 5)
指针p
指向数组a
的首元素a[0]
。p + 5
表示指针p
向后偏移 5 个int
类型的位置,即指向a[5]
,但数组a
的有效下标范围是 0 到 4,a[5]
越界了。对越界地址进行解引用*(p + 5)
会导致未定义行为,所以该选项错误。 - 选项 D:
*(p + 2)
指针p
指向数组a
的首元素a[0]
。p + 2
表示指针p
向后偏移 2 个int
类型的位置,即指向a[2]
。对p + 2
进行解引用*(p + 2)
就相当于访问数组a
的第 3 个元素a[2]
,这是对数组元素的正确引用,所以该选项正确。
综上,答案是 D。