C/C++题目--基本数据类型

题目:一个float变量赋值为3.1时,为什么printf输出的值为3.0999999?(在VS环境下,输出为3.1000000)

【答案】

计算机是用二进制来表示浮点数和整数的。在十进制里,0.1是个简单、精确的小数,但是转换二进制表示却是循环小数0.0001100110011…。因此,3.2在十进制可以准确地表示,在二进制却不能。但二进制转换为十进制时,该数值便就不一致了。

题目:

double a,b;
//…
if(a==b)
{//是否相等。}

【答案】

不相等。

解决:

#include<math.h>

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相同。

 

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/92001366