C/C++题目--基本数据类型
题目:一个float变量赋值为3.1时,为什么printf输出的值为3.0999999?(在VS环境下,输出为3.1000000)
【答案】
计算机是用二进制来表示浮点数和整数的。在十进制里,0.1是个简单、精确的小数,但是转换二进制表示却是循环小数0.0001100110011…。因此,3.2在十进制可以准确地表示,在二进制却不能。但二进制转换为十进制时,该数值便就不一致了。
题目:
double a,b;
//…
if(a==b)
{//是否相等。}
【答案】
不相等。
解决:
#include
if((fabs(a-b)<=epsilon*fabs(a)))
题目:以下程序代码,输出结果是什么?
bool b=-7;
BOOL B=-7;
cout<<b<<B<<endl;
b=2;
B=2;
if(b==true)
cout<<"满足b==true条件"<<endl;
if(B==TRUE)
cout<<"满足B==true条件"<<endl;
【答案】:
1 -7
满足b==true条件
请按任意键继续. . .
【分析】
区别:
(1)bool具有两个值true(1)或者false(0)。BOOL也具有两个值TRUE(1)和FALSE(0)。
(2)bool只占1个字节,而BOOL占用空间由编译器决定的,一般是4个字节。
(3)bool是布尔型,而BOOL在WinDef.h头文件里定义是整型。
(4)bool的值为非零数(包括正负的浮点数和整数),其结果都为1,即true.而BOOL类型的值要么是TRUE,要么就是FALSE。如果某值不是这两个值中的一个,该值在TRUE和FALSE的条件下都不成立。
题目:对于单精度浮点数-21.375在内存中存放的实际数据是什么?请写一段程序,当输入一个单精度浮点数时,打印出该浮点数在内存中实际存放的数。
【答案】
题目:在嵌入式编程中,经常会看到u8、u16、u32和u64的数据类型,请问它们代表的意义是什么?为什么要这么写?
【答案】
一般在x86体系的Linux系统中,u8、u16、u32和u64的数据类型定义如下:
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
原因如下:
(1)编写代码更方便,用简短的字符替代了冗长的字符。
(2)提高代码的可移植性,比如在不同平台下它们所对应的数据类型可能不同。比如u64,在一些平台下定义为
typedef unsigned long u64;
题目:已知整数(4字节)在内存中的内容,打印出该整数实际的值,请用C程序实现。
【提示】
考虑大小端字节序。举例,在内存中从低到高地址中存放的内容为12 34 ab cd(十六进制数),如果CPU是小端字节序,那么它对应的整数值为:0xcdab3214;如果该CPU是大端字节序,那么它对应的整数值为:0x1234abcd。
【解析】
该题目考查大小端字节序的移植性问题。在嵌入式开发中,C程序经常会在多个不同CPU体系下执行,所以不同CPU的大小端字节序问题是必要考虑的事情,否则程序就会因为平台兼容性问题而产生重大隐患。通常,在嵌入式开发调试过程中可以获得内存中的数据内容,根据这些数据可以验证程序的正确性,于是会出现这样的情况,比如已经从内容中打印出了一个整数的数值内容,但由于不确定CPU的字节序,所以无法直接确定该数值的正确结果,此时可以编写一个函数来实现整数值的正确解析。参考实现代码如下。
题目:以下代码输出结果为多少?
int main()
{
unsigned char a=-1;
signed char b=-1;
char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
答:a=255,b=-1,c=-1
【解析】
signed char取值范围为-127—127,unsigned char取值范围为0—255,至于char取值范围取决于编译器和编译时所用的选项。
在VS环境下,该char型域signed char相同。
还没有评论,来说两句吧...