对二补码

在翻东西的时候找到大一的时候的一个小翻译,值得记录一下。。。。开始把有用的东西都移到网上来了。感觉存到网上比存到本地要安全....

下面这个是 The C Programming Languate  第三章的练习。当时实在不会做,上网看了高人的解释....翻译理解了一下.....

练习3-4解释到:
There are a number of ways of representing signed integers in binary, for example, signed-magnitude, excess-M, one's complement and two's complement
有符号的长整型在二进制中有若干种表示方法,例如,超过限制的有符号整型值的对一补码和对二补码。我们想我们的讨论限制在后者。
在数的对一补码中,负数的补码的表示方式,仅仅是其正数通过取反该正数的二进制数位,来改变其符号的副本。譬如,二进制位为8位:
                SIGNED  BINARY  UNSIGNED
               
                  25   00011001     25
                 -25   11100110    230

                 127   01111111    127
                -127   10000000    128
这就意味着有两种方法来表示零(所有的 0 和 1 二进制位),有符号8位二进制的长度(量程)是 -127~127,而且其负数是(2^n-1)
(例如,-1的表示为(2^n-1)-(+1))。例如:

         (偏差)Bias = 2^8 - 1 = 255 = 11111111
                    (减)Subtract 25                  = 00011001
                    (等长度编码)Equals              =11100110

在对二补码表示中,负数是以(2^n)为偏差的,举例来说:
         Bias = 2^8  = 100000000
         Subtract 25 =  00011001
         Equals      =  11100111
换言之,找负数的对二补码的表示方法就是找到其对一补码然后加一。注意最重要的是一个8位二进制的值用的一个对二补码的表示方法是
-128~127,和用对一补码的-127~127不一样。因此,最小的负数的绝对值是不能被表示的 。(例如 我们不能表示 +128)。(Since the itoa() function in Chapter 3 handles negative numbers by reversing the sign of the number before processing, then adding a '-' to the string, passing the largest negative number will result it in being translated to itself)因为第三章
的在转换前将负数的符号取反,然后在字符串中加入'-',所以最小的负数会转换成其本身。
                 -128            : 10000000
                 One's complement: 01111111
                 Subtract 1      : 10000000
Therefore, because (n /= 10) will be negative, the do-while loop will run once only, and will place in the string a '-', followed by a single character, (INT_MIN % 10 + '0'). We can remedy these two bugs in the following way: 1 - change 'while ((n /= 10) > 0)' to 'while (n /= 10)'. Since any fractional part is truncated with integer division, n will eventually equal zero after successive divides by 10, and 'n /= 10' will evaluate to false sooner or later. 2 - change 'n % 10 + '0'' to 'abs(n % 10) + '0'', to get the correct character. EX3_4.C shows the revised function, which will run correctly regardless of the number representation.
 

Big Integer 失败啊......

记住这东西......

http://forum.ubuntu.org.cn/viewtopic.php?t=141934&highlight=

 

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5.  
  6. #define MAX 9000
  7.  
  8. char result[MAX];
  9. int i = 0;
  10.  
  11. enum {PASS, MINUS};
  12.  
  13. int sum(char *,char *,int);
  14. int ro(char *);
  15. void free_result();
  16. char *clear_zero(char *e);
  17.  

exersice.7-7.<The C Programming Language 2th edition>

恩...这次答案里没有了...

  1. /* 修改第5章的模式查找程序,使它从一个命名文件的集合中读取输入
  2. * (有文件名参数的时候),如果没有文件名参数,则从标准输入中读取输入。
  3. * 当发现一个匹配行时,是否应该将相应的文件名打印出来
  4. * exersice.7-7.<The C Programming Language second edition>.Page 145
  5. * Usague: ./myfind -nx pattern [file_patch...]
  6. * finish time: 08/08/04
  7. * by tlhl28
  8. * */
  9.  

exercise.7-2.<The C Programming Language>.Page 136

呃......这个的也和那个答案不一样。测试了一下答案,对输入没作什么处理啊,输出没改变......不知道是不是我哪搞错了。我比答案少一个功能,检测是否是图形字符。简述完毕!

  1. /* 编写一个程序,以合理的方式打印任何输入。该程序至少能够根据用户的习惯
  2. * 以八进制或十六进制打印非图形字符,并截断长文本行。
  3. * Usage: cat filename.txt | ./print_type -t 8/16;
  4. * exercise.7-2.<The C Programming Language>.Page 136.
  5. * */
  6.  

exercise.7-3.<The C programming Language>.Page136

 编的时候变量名字随便弄,感觉好乱。后来重新整理了下,可能不太规范(包括英文的命名),这过程花时间阿......。

下次要想好再弄了......。还有,本练习和我找到的答案差好远,答案实现各种格式的输出。我却去实现最小字段啊,精度阿,向左对齐的功能......难道是我把"更多功能"理解错了??

 

  1. /*改写minprintf函数, 使它能完成printf函数的更多功能
  2. *(没走 “printf("%.*s",max, s)” 这种途径,所以在打印
  3. * double型的时候精度只正能到小数点后13位)
  4. *exercise.7-3.<The C programming Language>.Page136
  5. *test_Usage: ./program_name
  6. * finish time : 08/08/02;
  7. * */

exercise.6-4 in <The C programming Language> ,page125

这个.......

  1. /* 编写一个程序,根据单词的出现频率安降序打印输入的各个不同单词,并
  2. * 在每个单词的前面标上它的出现次数。
  3. * exercise.6-4 in <The C programming Language> ,page125*/
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <string.h>
  7.  
  8. #define MAXWORD 100
  9.  
  10. struct tnode {    /*  树的节点      */
  11.     char *word;  /*  指向单词的指针  */
  12.     int count;    /*  单词出现的次数  */
  13.     struct tnode *left; /*  左子节点     */
  14.     struct tnode *right;/*  右子节点            */
  15.     struct snode *snode;/*  指向该单词在sort树中的节点       */
  16. };
  17.  
  18. struct snode {        /*    sort树的节点    */
  19.     struct tnode *tnode;    /*  指向该节点所放置的单词,在单词树中的节点        */
  20.     struct snode *left;     /*   左子节点    */
  21.     struct snode *right;    /*  右子节点    */
  22. };
  23.  

续“上学期同学给的C语言练习”

  1. void two(int i){
  2.     int s[2]={0};
  3.     for(q=0;q<i;++q){
  4.         for(l=0;l<2;++l)
  5.             scanf("%s",&vote[l]);
  6.         //printf("%c %c %c",vote[0],vote[1],vote[2]);
  7.  

上学期同学给的C语言练习

上学期同学从其它学校拿来的题.当时只学了一点点.(惭愧啊,一个学期学了很少的东西,还是那么懒.....)

题目要求在这大概简述一下,题目丢了.

多人对三个候选人,分别为 a, b, c ,进行投票.排第一个拿5分,第二个拿3分,第三个2分.

若重复,出现未知候选人,要在输入投票内容后提示错误,但不影响投票结果,结果中不包含错误票提交的分数.

分数相同者要重新投票,若是有两人相同票数,要提示要求哪两人重投.

这是我的

 

 

  1. #include <stdio.h>
  2. char *b[2];
  3. int i,k,l,q,w,x,j;      //LINUX下每个FOR循环要用不同变量,好象还和循序有关......你在WINDOWS下试下减少变量......
  4. int swap;       //记录统计结果较大的数组下标
  5. char vote[3];   //记录投票内容,如:a,b,c
  6. void two(int i);        //两人投票
  7. int mark=0;
  8.  
  9. main()
  10. {
  11.     int m;
  12.     char a[]={'a','b','c'};     //用于实现统计功能
  13.     int s[3]={0};                     //分别固定记录a,b,c的得分,如:s[0]固定记录a[0](即'a')的得分
  14.     //printf("%c %c %c",a[0],a[1],a[2]);
  15.     printf("\nman:");
  16.     scanf("%d",&i);
  17.     printf("case a vote:\n");
  18.  

续nqsort

  1. /*  writelines函数: 写输出行*/
  2. void writelines(char *lineptr[],int nlines)
  3. {
  4.     int i;
  5.  
  6.     for(i = 0; i < nlines;++i)
  7.         printf("%s\n",lineptr[i]);
  8. }
  9.  
  10. /*  swap函数:交换v[i]和v[j]*/
  11. void swap(void *v[],int i, int j)
  12. {
  13.     void *temp;
  14.  
  15.     temp = v[i];
  16.     v[i] = v[j];
  17.     v[j] = temp;
  18. }
  19.  

YEASH!!!

刚发现有这样适合 programmer的BLOG!

就把我今天刚作的C语言的小练习方上来看看先~~

初学编程,练习是 The C programming language 里的

练习5-14

请指教...
 

  1. /*对输入文本进行排序,
  2. *nqsort -n -r
  3. *其中参数 -n 是按数值排序, -r是逆序
  4. * *exercise.5-13.in 《The C Programming Language》,page102 */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9.  
  10. #define MAXLINES 5000
  11. char *lineptr[MAXLINES];
  12.  
  13. int readlines(char *lineptr[],int nlines);
  14. void writelines(char *lineptr[], int nlines);
  15. void swap(void *v[],int i, int j);
  16.  
  17. void nqsort(void *lineptr[],int left, int right,int argument,
  18.                 int (*comp)(void *, void *));
  19. int numcmp(char *, char *);
  20.  
  21. int main(int argc, char **argv)
  22. {
  23.     int c;
  24.     int nlines = 0;
  25.     int numeric = 0,reverse = 0;
  26.  
  27.     while(--argc > 0 && *(++argv)[0] == '-')
  28.        while((c = *++argv[0]))
  29.         switch(c){
  30.             case 'n':
  31.                 numeric = 1;
  32.                 break;
  33.             case 'r':
  34.                 reverse = 1;
  35.                 break;
  36.             default:
  37.                 printf("nnqsort: illegal option %c \n",c);
  38.                 argc = 0;
  39.                 break;
  40.        }
  41.     printf("n:%d\n r:%d\n",numeric,reverse);
  42.     if(argc != 0)
  43.         printf("Usage: nqort -n -r \n");
  44.     else{
  45.         if((nlines = readlines(lineptr,MAXLINES)) >= 0) {
  46.             nqsort((void **)lineptr,0,nlines-1,reverse,
  47.                     (int (*)(void *, void *))(numeric ? numcmp : strcmp));
  48.             writelines(lineptr, nlines);
  49.             return 0;
  50.         }else {
  51.             printf("input too big to sort\n");
  52.             return 1;
  53.         }
  54.     }   
  55.     return 0;
  56. }
  57.