祝福大家新年快乐,虎虎生威

pang123hui 2010-02-13 10:25:51

新的一年,新的开始

在这里混个脸熟,别的不多说,祝大家学业有成,事业有成,新年快乐!!

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

不过咱们过个年也不能忘了学习啊

考大家一个小题目,全当娱乐


#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;
}


这里假设char是有符号的

嘿嘿,大家好好想想,答案见1楼。

...全文
144 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2010-02-19
  • 打赏
  • 举报
回复

每天回帖即可获得10分可用分!
cocat 2010-02-14
  • 打赏
  • 举报
回复
新年快乐,虎年大吉~~
hemiya 2010-02-14
  • 打赏
  • 举报
回复
机智的呆呆 2010-02-14
  • 打赏
  • 举报
回复
匚匚 2010-02-14
  • 打赏
  • 举报
回复
在新的一年里,希望都能勇攀学术高峰
yitaohust 2010-02-14
  • 打赏
  • 举报
回复
呵呵,新年来接分!!
tian545882735 2010-02-14
  • 打赏
  • 举报
回复
新年快乐!大家发财哦
nwpulei 2010-02-14
  • 打赏
  • 举报
回复
jf + 新年快乐~~~~~~~~~~~
eTouX 2010-02-14
  • 打赏
  • 举报
回复
char 里面存的单元全部是一字节的,尽管i是int的,但是在类型转换后,只保留最低字节。所以到256就为0了。所以答案是255
smallbear_2008 2010-02-14
  • 打赏
  • 举报
回复
楼主有理,-129是需要9位了,谢谢!
pang123hui 2010-02-14
  • 打赏
  • 举报
回复
引用 17 楼 smallbear_2008 的回复:
引用 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

请指教,谢谢。


晕,这里我假设是有符号位,众所周知8位可以表示的数为-128到127

首先你这句话有问题:"-129补码为129的原码取反加一,即 10000001 取反加一"

也就是说你是把1 000 0001作为+129了,或者说你已经不把最高位当符号位看了……



yzx714 2010-02-14
  • 打赏
  • 举报
回复
jf
阿发伯 2010-02-14
  • 打赏
  • 举报
回复
smallbear_2008 2010-02-14
  • 打赏
  • 举报
回复
引用 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

请指教,谢谢。
stardust20 2010-02-13
  • 打赏
  • 举报
回复
新年快乐
昵称很不好取 2010-02-13
  • 打赏
  • 举报
回复
呵呵,新年快乐~~~~~~~~~~~
zenny_chen 2010-02-13
  • 打赏
  • 举报
回复
呵呵。每必要那么快公布答案吧。
不过这个也还算简单。
接分,然后祝楼主、给位虎年吉祥。记得看《虎虎生威》啊,嘿嘿。
mstlq 2010-02-13
  • 打赏
  • 举报
回复
编译器的扩展……

可以理解为方言,不通用……

pang123hui 2010-02-13
  • 打赏
  • 举报
回复
引用 2 楼 mstlq 的回复:
1楼的分析似乎很全面……

但是,实际上……
由于没有#include <string.h>
所以那段代码很有可能会在编译的时候就通不过了,囧……


这里请教一个问题,确实比如题目中strlen()按理说是需要string.h的,或者说一些其它的需要包含某个头文件才可以用的函数

为什么我的MingGW3.45都不需要呢??

这事以前想过,结果不了了之了
mstlq 2010-02-13
  • 打赏
  • 举报
回复
1楼的分析似乎很全面……

但是,实际上……
由于没有#include<string.h>
所以那段代码很有可能会在编译的时候就通不过了,囧……

加载更多回复(1)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧