本文共 898 字,大约阅读时间需要 2 分钟。
可先参考,相关的内存数据存储及运算的博文。
1、2、
#include#include int main(){ char a[1000]; int i; for(i=0; i<1000; i++) { a[i] = -1-i; } printf("%d",strlen(a)); return 0;}
猜,答案是多少?第一次做就错了,2333。。。。。
做这个题的基础你必须得先理解上面所讲。答案 255
先掌握一个快速算负数在内存当中补码的技巧,先写出对应正数的二进制,然后最高位补1,然后从最低位开始遇到第一个1之前都不变,遇到之后,保留这个1以及符号位,这之间的数按位取反即可。
下面仔细分析一波:
-1在内存当中的存储为:0000 0001->1000 0001->1111 1111 -2在内存当中的存储为:0000 0010->1000 0010->1111 1110 …… -127对应存储为:0111 1111->1111 1111->1000 0001 -128对应存储为:1000 0000->1 1000 0000->1 1000 0000->(取八位)1000 0000 -129对应存储为:1000 0001->1 1000 0001->1 0111 1111->(取八位)0111 1111 …… -255对应存储为:1111 1111->1 1111 1111->1 0000 0001->(取八位)0000 0001 -256对应存储为:1 0000 0000->11 0000 0000->11 0000 0000->(取八位)0000 0000 -257对应存储为:1 0000 0001->11 0000 0001->10 1111 1111->(取八位)1111 1111 此处相当于又从-1开始了strlen 函数是计算字符串长度的,并不包含字符串最后的‘\0’。
所以到a[255]=-256就完了,所以总长度为a[0]到a[254]共255
转载地址:http://pmnaf.baihongyu.com/