这一章,也是一些基础知识的运用:对数据类型的认识、数据类型的转换。里面写了一些我对题目的理解,如有错误欢迎大家指正
总时间限制: 1000ms 内存限制: 65536kB
描述
分别定义int,short类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)。输入
无。
输出
一行,两个整数,分别是两个变量的存储空间大小,用一个空格隔开。
样例输入
(无)
样例输出
(不提供)
提示
使用sizeof函数可以得到一个特定变量的存储空间大小。例如:对于int型变量x,sizeof(x)的值为4,即x的存储空间为4字节。
C语言中sizeof函数计算的是变量/类型所占空间的大小,单位是字节,所以要想知道int和short类型变量的存储空间,只需要用sizeof函数即可得出,与下两题题计算float和double类型、bool和char类型变量的存储空间,以及最后一题计算“Hello, World!”的大小的道理是一样的
#include <stdio.h>
int main(){
printf("%d %d",sizeof(int), sizeof(short));
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
描述
分别定义float,double类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)。
输入
无。
输出
一行,两个整数,分别是两个变量的存储空间大小,用一个空格隔开。
样例输入
(无)
样例输出
(不提供)
#include <stdio.h>
int main(){
printf("%d %d",sizeof(float), sizeof(double));
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
描述
分别定义bool,char类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)。
输入
无。
输出
一行,两个整数,分别是两个变量的存储空间大小,用一个空格隔开。
样例输入
(无)
样例输出
(不提供)
#include <stdio.h>
#include <stdbool.h>
int main(){
printf("%d %d",sizeof(bool), sizeof(char));
}
总时间限制: 1000ms 内存限制: 65536kB
描述
有两个变量a和b,在执行了如下代码后:a = 32768; b = a; printf("%d %d\n", a, b);
输出两个数:32768 -32768
请问a和b分别是以下哪种类型?
A. bool B. char C. short D. int E. float F. double
输入
无。
输出
一行,包含两个大写字母,分别代表变量a和b的类型标号。中间用一个空> 格隔开。
样例输入
无
样例输出
A B
// 仅作格式示例,非正确答案
这题涉及到强制类型转换,a和b的值都是整形,所以直接排除A、B、E、F,32768的二进制表示形式:1000 0000 0000 0000B,执行代码后输出的两个数32768 -32768,说明a能正确表示32768这个数,short、int类型分别所占的存储空间为2、4个字节,即16、32位,能表示的最大值分别为215-1、231-1,所以a的类型只能是int型;
输出的b是负数,说明发生了强制类型转换,a是int类型,在底层存储的二进制形式是0000 0000 0000 0000 1000 0000 0000 0000B,把a赋值给b,那么就说明b在底层存储的二进制形式就是1000 0000 0000 0000B(就是相当于在a的二进制表示上切了一刀,把前面两个字节的0全部切掉了),由于底层存储的是补码,第一位为符号位,是1,所以就是负数,而这个二进制补码表示的数就是-32768(因为补码比原码能多表示一个数)
#include <stdio.h>
int main(){
printf("D C");
}
总时间限制: 1000ms 内存限制: 65536kB
描述
有两个变量a和b,在执行了如下代码后:a = 1.000000001; b = a; printf("%.9f %.9f\n", a, b);
输出两个数:1.000000001 1.000000000
请问a和b分别是以下哪种类型?
A. bool B. char C. short D. int E. float F. double
输入
无。
输出
一行,包含两个大写字母,分别代表变量a和b的类型标号。中间用一个> 空格隔开。
样例输入
无
样例输出
A B
// 仅作格式示例,非正确答案
由于a、b为浮点数,所以直接排除掉了A、B、C、D。单精度浮点数(float)在底层的存储形式是:1bit符号位+8bit阶码+23bit尾数,双精度(double)在底层存储形式:1bit符号位+11bit阶码+52bit尾数,尾数的位数决定了能表示数的精确度,所以我们可以看到双精度浮点数能表示的数更准确
这也就是为什么C语言中单精度浮点数类型小数点后有效的位数只有6位,而双精度的有效位有16位,所以执行上诉代码后,a能准确表示1.000000001,而b不能
#include <stdio.h>
int main(){
printf("F E");
}
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个单精度浮点数,将其向零舍入到整数。
说明:向零舍入的含义是,正数向下舍入,负数向上舍入。
提示:可以使用强制类型转换来实现。
输入
一个单精度浮点数。
输出
一个整数,即向零舍入到整数的结果。
样例输入
2.3
样例输出
2
这个题目直接用强制类型转换做即可,float类型转换成int类型,就是直接把整数部分留下,小数部分直接被舍去了
#include <stdio.h>
int main() {
float n =0;
scanf("%f", &n);
printf("%d", (int)n);
}
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个除空格以外的可见字符(保证在函数scanf中可使用格式说明符%c读入),输出其ASCII码。
输入
一个除空格以外的可见字符。
输出
一个十进制整数,即该字符的ASCII码。
样例输入
A
样例输出
65
要想知道字符的ASCII码值,直接强制类型转换成int类型,底层存储字符a的形式都是二进制形式,而我们看到的char类型和int类型的形式不同,只是对同一个二进制解释方式不一样,char类型解释成a,int类型就解释成98了,所以下一题反过来输入ASCII码输出字符的道理是一样的
#include <stdio.h>
int main() {
char c;
scanf("%c", &c);
printf("%d", (int)c);
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个ASCII码,输出对应的字符。
输入
一个整数,即字符的ASCII码,保证存在对应的可见字符。
输出
一行,包含相应的字符。
样例输入
65
样例输出
A
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
printf("%c", (char)n);
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
描述
将一个整型变量的值赋给一个布尔型变量,再将这个布尔型变量的值赋给一个整型变量,得到的值是多少?
输入
一个整型范围内的整数,即初始时整型变量的值。
输出
一个整数,经过上述过程后得到的结果。
样例输入
3
样例输出
1
bool和int类型分别是1、4字节,即8、32bit,数字3在底层存储的二进制形式:0000 0000 0000 0000 0000 0000 0000 0011B,强转成bool类型后,将前面3字节切掉,于是就变成0000 0011B,C语言的bool类型,无论给这个类型的变量赋任何非0整数值,其值都是1。
所以最终变成0000 0001B,最后再强转为int类型,进行符号扩展,由于0000 0001B是正数,所以高位扩展直接添0,最终变成了0000 0000 0000 0000 0000 0000 0000 0001B
大概是这样理解的吧,如有错误,欢迎指正(或者说bool类型只占1bit?)
#include <stdio.h>
#include <stdbool.h>
int main() {
int n;
scanf("%d", &n);
bool b = (bool)n;
n = (int)b;
printf("%d", n);
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
描述
还记得在上一章里,我们曾经输出过的“Hello, World!”吗?
它虽然不是本章所涉及的基本数据类型的数据,但我们同样可以用sizeof函数获得它所占用的空间大小。
请编程求出它的大小,看看跟你设想的是否一样?
输入
无。
输出
一个整数,即“Hello, World!”的大小。
样例输入
(无)
样例输出
(不提供)
提示
“Hello, World!”实际上是字符串类型,将在1.7章中详细介绍。
#include <stdio.h>
int main(){
printf("%d", sizeof("Hello, World!"));
}