#include <stdio.h> int main(void) { char a[1000]; int i; for(i=0; i<1000; i++) { a[i] = -1-i; } printf("%d",strlen(a)); //请问输出的值为多少呢??? return 0; }
引用 1 楼 pang123hui 的回复:按照负数补码的规则,可以知道-1 的补码为0xff,-2 的补码为0xfe……当i 的值为127时,a[127]的值为-128,而-128 是char 类型数据能表示的最小的负数。当i 继续增加,a[128]的值肯定不能是-129。因为这时候发生了溢出,-129 需要9 位才能存储下来,而char 类型数据只有8 位,所以最高位被丢弃。剩下的8 位是原来9 位补码的低8 位的值,即0x7f。 当i 继续增加到255 的时候,-256 的补码的低8 位为0。然后当i 增加到256 时,-257 的补码的低8 位全为1,即低八位的补码为0xff,如此又开始一轮新的循环…… 按照上面的分析,a[0]到a[254]里面的值都不为0,而a[255]的值为0。strlen 函数是计算字符串长度的,并不包含字符串最后的‘\0’。而判断一个字符串是否结束的标志就是看是否遇到‘\0’。如果遇到‘\0’,则认为本字符串结束。 分析到这里,strlen(a)的值为255 应该完全能理解了。 请教:这里129是由于需要9位来保存吗?我对这个不理解,我获取-129的值的方法是:-129在内存中以补码存储,而-129补码为129的原码取反加一,即 10000001 取反加一,为0x7f。这样理解依此类推,所得strlen(a)的值为255 请指教,谢谢。
按照负数补码的规则,可以知道-1 的补码为0xff,-2 的补码为0xfe……当i 的值为127时,a[127]的值为-128,而-128 是char 类型数据能表示的最小的负数。当i 继续增加,a[128]的值肯定不能是-129。因为这时候发生了溢出,-129 需要9 位才能存储下来,而char 类型数据只有8 位,所以最高位被丢弃。剩下的8 位是原来9 位补码的低8 位的值,即0x7f。 当i 继续增加到255 的时候,-256 的补码的低8 位为0。然后当i 增加到256 时,-257 的补 码的低8 位全为1,即低八位的补码为0xff,如此又开始一轮新的循环…… 按照上面的分析,a[0]到a[254]里面的值都不为0,而a[255]的值为0。strlen 函数是计 算字符串长度的,并不包含字符串最后的‘\0’。而判断一个字符串是否结束的标志就是看 是否遇到‘\0’。如果遇到‘\0’,则认为本字符串结束。 分析到这里,strlen(a)的值为255 应该完全能理解了。
1楼的分析似乎很全面…… 但是,实际上…… 由于没有#include <string.h> 所以那段代码很有可能会在编译的时候就通不过了,囧……
69,382
社区成员
243,073
社区内容
加载中
试试用AI创作助手写篇文章吧