memset的使用以及原码反码补码.md
来源:互联网 发布:python谷歌浏览器驱动 编辑:程序博客网 时间:2024/06/07 09:39
原码反码补码的设计是为了计算机算加法与减法(为简化,此处使用的是8位)
正数的原码=反码=补码
负数情况较为复杂:负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[-1] = [10000001]原 = [11111110]反 = [11111111]补
计算机必然不会去区分符号位,因此符号位是要参与计算的,如果使用原码计算:
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
使用反码计算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
使用补码计算:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [1 0000 0000 ] = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1 1000 0000]= [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)
-128并没有原码和反码表示
计算机中负数是以反码方式存储
memset的使用
功能
将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S的指针。
要注意的是,memset是对字节进行操作,所以上述程序如果改为 int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<<array[i]<<" "; cout<<endl; memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同 for(int k = 0; k < 5; k++) cout<<array[k]<<" "; cout<<endl; 输出的结果就是: 1 4 3 5 2 16843009 16843009 16843009 16843009 16843009 为什么呢? 因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。
memset只填充1个字节(8位)
int first[10+1],next[10+1];memset(first,-128, sizeof(first));for (int j = 0; j < 11; ++j) { cout << first[j] <<" ";}int a = 0x80808080;//(0x80 = 1000 0000 = -128的补码)cout <<" "<< a <<endl;输出:-2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144
memset初始化为-1
int first[10+1],next[10+1];memset(first,-1, sizeof(first));for (int j = 0; j < 11; ++j) { cout << first[j] <<" ";}int a = 0xffffffff;//(0xff = 1111 1111 = -1的补码)cout <<" "<< a <<endl;输出:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
另一个初始化为-1的实现方式
int first[10+1],next[10+1]; memset(first,255, sizeof(first)); for (int j = 0; j < 11; ++j) { cout << first[j] <<" "; }// int a = 0x7f7f7f7f;//(0x7f = 0111 1111 = 127的补码) int a = 0xffffffff;//(0xff = 1111 1111 = 255的补码) cout <<" "<< a <<endl;输出:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
- memset的使用以及原码反码补码.md
- 原码、反码、补码以及补码是怎么来的
- 原码、反码、补码及使用补码的原因
- 正负数的原码、反码以及补码
- 原码、反码、补码,以及负数的位操作
- 有关原码、反码以及补码的一些想法
- 关于原码,反码,补码以及数据的溢出
- 原码,反码,补码以及作用
- 二进制原码,反码以及补码实战
- 原码、反码、补码
- 原码-反码-补码
- 原码、反码、补码
- 原码、反码、补码
- 原码,反码,补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 详解Spring事件驱动模型
- python列表知识汇总
- POJ 2309 BST
- JAVA编码转换的详细过程理解—>浏览器和服务器的接收和发送数据的编码
- 【Spark Java API】Transformation(3)—union、intersection
- memset的使用以及原码反码补码.md
- [Hadoop] Hadoop Yarn显示DEBUG调试信息的配置方法
- iOS实现TextView提示文字并且输入字数限制
- hello word
- 【NOIP提高】公约数
- 【Spark Java API】Transformation(4)—coalesce、repartition
- AlarmManager使用
- 用Python实现网络爬虫
- php几种排序算法