您的位置:首页 > 其它

signed,unsigned关键字

2010-04-20 21:36 239 查看
一个32位的signed int类型整数其值表示法范围为:- 231~231 -1;8 位的
char类型数其值表示的范围为- 27~27 -1。一个32位的unsigned int类型整数其值表示法
范围为:0~ 232 -1;8位的char类型数其值表示的范围为0~28 -1。

一个有意思的程序:

intmain()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;

}

结果输出: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’,则认为本字符串结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: