首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

function improve,该如何处理

2013-08-01 
function improve/*itoa: convert n to characters in s */void itoa(int n, char s[]){int i, signif ((

function improve

/*itoa: convert n to characters in s */
void itoa(int n, char s[])
{
      int i, sign;

      if ((sign = n) < 0) /* record sign*/
          n = -n;
      i = 0;
      do {     /* generate digits in reverse order*/
            s[i++] = n % 10 + '0'; /* get next digit */
       }   while ((n /= 10) > 0);   /* delete it */
       if (sign < 0)
           s[i++] = '-';
       s[i] = '\0';
       reverse(s) ;
}


书上给了一个itoa这么一个函数,作用是把整数类型改成character string, 大致流程就是先把n这个数的符号记下来,然后把n各个位上的数(个十百千万等等)放入character array s[]里面,然后把s反过来(因为原来是反着记录的),最后把符号加上。

问题是,书后作业提出itoa在二进制补码的表示下没法表示“the largest negative number"(2 to the power of (word size -1)),要求改善这一点。

对于我的理解来说, 首先为什么在二进制补码表示下会造成问题? 我觉得这个函数的流程没有问题啊,难道是什么细节问题吗?其次就是改善了,但因为第一个问题。。。我完全没法做改善。。。

求各位给点想法
[解决办法]
第一个问题:
数据是有范围的,w位的数据,那么范围就是-2^(w-1) 到2^(w-1)-1;
比如8位的数据类型,那么范围就是-2^7到2^7-1;
而计算机表示负数的方式是用补码,把原来的首位定为符号位,
范围就是10000000到01111111,
所以对于最小的一个负数,
if ((sign = n) < 0) /* record sign*/
          n = -n;

这句代码是取不到正数的,因为没有和它对应的正数,所以这个函数处理不了最小的负数的。
第二个问题:
知道原因就好处理了
/*itoa: convert n to characters in s */
void itoa(int n, char s[])
{
int i, sign;
unsigned int res;
res = (unsigned int)n;
if ((sign = n) < 0) /* record sign*/


res = (unsigned int)((~n) + 1);
i = 0;
do {     /* generate digits in reverse order*/
s[i++] = res % 10 + '0'; /* get next digit */
}   while ((res /= 10) > 0);   /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s) ;
}


首先,让负数变成正数,因为负数是用二进制补码表示的,所以把它取反加1就是正数的值,
然后把它强制转换为无符号数据类型去处理。

热点排行