摘要:在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。char类型默认情况下是有符号的,其表示的值的范围为[-128,127],超出这个范围的值会产生溢出.char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a)); 255柔性数组到底如
阅读全文
摘要:数组名不是对象,数组才是对象,指针也是一种对象,因此,数组名并没有内存空间,它是一个右值。想看具体的代码么?把下面的代码汇编一下,就可以看见其区别了:char a[10]; char *p; p=a; a[2]=10; p[2]=20; 编译器编译后的汇编代码是这样的: _main proc near push bp mov bp,sp sub sp,10 push si lea si,word ptr [bp-10] ;这个就是p=a,p被保存在某个地方,这里p被优化为保存在寄存器 mov byte ptr [bp-8],10 ;这个是a[2]=10,a是直接堆栈操作,因为它是一个地址,没有
阅读全文
摘要:学了一年了,还是会在字符指针 指向 常量弄错..今天记下来,提醒自己..char* p=new char[7];p="ABCDEF"; //1,*(p+1)='L'; //2.delete p; //3.首先为 p 字符指针变量 分配内存大小为7;p指向了常量"ABCDEF",接着, *(p+1)='L'; 就错了,为什么了.因为 p 指向了常量, 常量是不可修改的(正常情况下). VirtualProtect();delete p; 接着也错了,为什么了.因为 p存放的是常量的指针,而不是刚开始 NEW 出来的指针...
阅读全文