C++面试笔试题目(选2)(字符串,原码反码补码)
来源:互联网 发布:pl2303hx数据手册 编辑:程序博客网 时间:2024/06/04 00:41
编写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)(字符串,原码反码补码)
- java基础(1) 原码反码补码 原码反码补码原码反码补码原码反码补码原码反码补码原码反码补码原码反码补码
- (C基础)字节,原码,反码,补码
- 小朋友学C语言(35):原码、反码、补码
- C 【原码 反码 补码】
- 原码反码补码(转)
- 关于原码、反码、补码(ZZ)
- 原码 反码 补码(转)
- 原码, 反码, 补码 详解(转)
- 原码,反码和补码(复习)
- 原码, 反码, 补码 详解(二)
- 原码, 反码, 补码 详解(一)
- 原码, 反码, 补码 详解(转)
- 二进制(原码、反码、补码)(转载)
- 挑战面试编程:原码、反码、补码
- 【C语言程序设计】原码、反码、补码详解
- C 语言 - 整型 原码,反码,补码
- C语言原码、反码、补码
- phpQuery的用法
- 配置IntelliJ IDEA 13的SBT和Scala开发环境
- Unix时间戳(Unix timestamp)转换
- 文件上传时判断是否为图片
- Android 性能优化
- C++面试笔试题目(选2)(字符串,原码反码补码)
- AJAX跨域访问
- 第十一周项目1层次遍历算法的验证
- lua table访问的元方法
- POJ 2288 Islands and Bridges 状态压缩DP
- category添加成员变量
- Java将Unix时间戳转换成指定格式日期
- Java基础面试题笔记(2)
- 每天00:00:01循环执行定时任务