C++面试笔试题目(选2)(字符串,原码反码补码)

编写strcpy函数

已知strcpy函数的原型是

    char *strcpy(char *strDest, const char *strSrc);

    其中strDest是目的字符串,strSrc是源字符串。

char* strcpy(char* des,const char* source)
{
char* r=des;
assert((des != NULL) && (source != NULL));
 while((*des++ = *source++)!='\0');
 return r;
}

strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

答:为了实现链式表达式。

例如 int length = strlen( strcpy( strDest, “hello world”) );

编写类String的构造函数、析构函数和赋值函数

已知类String的原型为:

 class String

 {

   public:

     String(const char *str = NULL); // 普通构造函数

     String(const String &other);         // 拷贝构造函数

     ~ String(void);                      // 析构函数

     String & operate =(const String &other);     // 赋值函数

   private:

     char     *m_data;                 // 用于保存字符串

 };

    请编写String的上述4个函数。

标准答案:

// String的析构函数

    String::~String(void)                // 3分

{

 delete [] m_data;                      

// 由于m_data是内部数据类型,也可以写成 delete m_data;

    }

    // String的普通构造函数             

    String::String(const char *str)       // 6分

{

 if(str==NULL)                          

 {

    m_data = new char[1];     // 若能加 NULL 判断则更好

    *m_data = ‘ 0’;                      

 }                                          

 else

 {

    int length = strlen(str);           

    m_data = new char[length+1];   // 若能加 NULL 判断则更好      

    strcpy(m_data, str);                

 }

}

// 拷贝构造函数

 String::String(const String &other)    // 3分

 {   

 int length = strlen(other.m_data);

 m_data = new char[length+1];       // 若能加 NULL 判断则更好    

 strcpy(m_data, other.m_data);         

}

// 赋值函数

 String & String::operate =(const String &other)     // 13分

 {   

    // (1) 检查自赋值                      // 4分

    if(this == &other)

        return *this;

// (2) 释放原有的内存资源 // 3分

    delete [] m_data;

    // (3)分配新的内存资源,并复制内容 // 3分

 int length = strlen(other.m_data);

 m_data = new char[length+1];          // 若能加 NULL 判断则更好

     strcpy(m_data, other.m_data);

    // (4)返回本对象的引用             // 3分

    return *this;

}

原码, 反码, 补码 详解

参考:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
文章写的很好,强烈建议完整阅读

1、机器数

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。

那么,这里的 00000011 和 10000011 就是机器数。

2、真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

  • 原码

    原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

    [+1]原 = 0000 0001

    [-1]原 = 1000 0001

    第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

    [1111 1111 , 0111 1111]

    [-127 , 127]

    原码是人脑最容易理解和计算的表示方式.

  • 反码

    反码的表示方法是:

    正数的反码是其本身

    负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

    [+1] = [00000001]原 = [00000001]反

    [-1] = [10000001]原 = [11111110]反

    可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

  • 补码

    补码的表示方法是:

    正数的补码就是其本身

    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    [+1] = [00000001]原 = [00000001]反 = [00000001]补

    [-1] = [10000001]原 = [11111110]反 = [11111111]补

    对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

你可能感兴趣的:(C++面试笔试题目(选2)(字符串,原码反码补码))