Mon, 15 Mar 2010 08:04:39 +0800
在翻东西的时候找到大一的时候的一个小翻译,值得记录一下。。。。开始把有用的东西都移到网上来了。感觉存到网上比存到本地要安全....
下面这个是 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.
Tags: C语言
Posted in 随笔 | 359 Comments
Sun, 10 Aug 2008 04:33:14 +0800
记住这东西......
http://forum.ubuntu.org.cn/viewtopic.php?t=141934&highlight=
-
#include <stdio.h>
-
#include <string.h>
-
#include <ctype.h>
-
#include <stdlib.h>
-
-
#define MAX 9000
-
-
char result[MAX];
-
int i = 0;
-
-
enum {PASS, MINUS};
-
-
int sum(char *,char *,int);
-
int ro(char *);
-
void free_result();
-
char *clear_zero(char *e);
-
Tags: C语言
Posted in C语言 | 141 Comments
Tue, 05 Aug 2008 04:12:22 +0800
恩...这次答案里没有了...
-
/* 修改第5章的模式查找程序,使它从一个命名文件的集合中读取输入
-
* (有文件名参数的时候),如果没有文件名参数,则从标准输入中读取输入。
-
* 当发现一个匹配行时,是否应该将相应的文件名打印出来
-
* exersice.7-7.<The C Programming Language second edition>.Page 145
-
* Usague: ./myfind -nx pattern [file_patch...]
-
* finish time: 08/08/04
-
* by tlhl28
-
* */
-
Tags: C语言
Posted in 随笔 | 2223 Comments
Sun, 03 Aug 2008 02:47:20 +0800
呃......这个的也和那个答案不一样。测试了一下答案,对输入没作什么处理啊,输出没改变......不知道是不是我哪搞错了。我比答案少一个功能,检测是否是图形字符。简述完毕!
-
/* 编写一个程序,以合理的方式打印任何输入。该程序至少能够根据用户的习惯
-
* 以八进制或十六进制打印非图形字符,并截断长文本行。
-
* Usage: cat filename.txt | ./print_type -t 8/16;
-
* exercise.7-2.<The C Programming Language>.Page 136.
-
* */
-
Tags: C语言
Posted in C语言 | 217 Comments
Sun, 03 Aug 2008 02:35:09 +0800
编的时候变量名字随便弄,感觉好乱。后来重新整理了下,可能不太规范(包括英文的命名),这过程花时间阿......。
下次要想好再弄了......。还有,本练习和我找到的答案差好远,答案实现各种格式的输出。我却去实现最小字段啊,精度阿,向左对齐的功能......难道是我把"更多功能"理解错了??
-
/*改写minprintf函数, 使它能完成printf函数的更多功能
-
*(没走 “printf("%.*s",max, s)” 这种途径,所以在打印
-
* double型的时候精度只正能到小数点后13位)
-
*exercise.7-3.<The C programming Language>.Page136
-
*test_Usage: ./program_name
-
* finish time : 08/08/02;
-
* */
-
Tags: C语言
Posted in C语言 | 139 Comments
Tue, 24 Jun 2008 06:32:26 +0800
这个.......
-
/* 编写一个程序,根据单词的出现频率安降序打印输入的各个不同单词,并
-
* 在每个单词的前面标上它的出现次数。
-
* exercise.6-4 in <The C programming Language> ,page125*/
-
#include <stdio.h>
-
#include <ctype.h>
-
#include <string.h>
-
-
#define MAXWORD 100
-
-
struct tnode { /* 树的节点 */
-
char *word; /* 指向单词的指针 */
-
int count; /* 单词出现的次数 */
-
struct tnode *left; /* 左子节点 */
-
struct tnode *right;/* 右子节点 */
-
struct snode *snode;/* 指向该单词在sort树中的节点 */
-
};
-
-
struct snode { /* sort树的节点 */
-
struct tnode *tnode; /* 指向该节点所放置的单词,在单词树中的节点 */
-
struct snode *left; /* 左子节点 */
-
struct snode *right; /* 右子节点 */
-
};
-
Tags: C语言
Posted in C语言 | 367 Comments
Fri, 06 Jun 2008 00:58:52 +0800
-
void two(int i){
-
int s[2]={0};
-
for(q=0;q<i;++q){
-
for(l=0;l<2;++l)
-
scanf("%s",&vote[l]);
-
//printf("%c %c %c",vote[0],vote[1],vote[2]);
-
-
Tags: C语言
Posted in C语言 | 1356 Comments
Sun, 01 Jun 2008 09:18:50 +0800
上学期同学从其它学校拿来的题.当时只学了一点点.(惭愧啊,一个学期学了很少的东西,还是那么懒.....)
题目要求在这大概简述一下,题目丢了.
多人对三个候选人,分别为 a, b, c ,进行投票.排第一个拿5分,第二个拿3分,第三个2分.
若重复,出现未知候选人,要在输入投票内容后提示错误,但不影响投票结果,结果中不包含错误票提交的分数.
分数相同者要重新投票,若是有两人相同票数,要提示要求哪两人重投.
这是我的
-
#include <stdio.h>
-
char *b[2];
-
int i,k,l,q,w,x,j; //LINUX下每个FOR循环要用不同变量,好象还和循序有关......你在WINDOWS下试下减少变量......
-
int swap; //记录统计结果较大的数组下标
-
char vote[3]; //记录投票内容,如:a,b,c
-
void two(int i); //两人投票
-
int mark=0;
-
-
main()
-
{
-
int m;
-
char a[]={'a','b','c'}; //用于实现统计功能
-
int s[3]={0}; //分别固定记录a,b,c的得分,如:s[0]固定记录a[0](即'a')的得分
-
//printf("%c %c %c",a[0],a[1],a[2]);
-
-
scanf("%d",&i);
-
-
Tags: C语言
Posted in C语言 | 218 Comments
Thu, 29 May 2008 04:48:05 +0800
-
/* writelines函数: 写输出行*/
-
void writelines(char *lineptr[],int nlines)
-
{
-
int i;
-
-
for(i = 0; i < nlines;++i)
-
-
}
-
-
/* swap函数:交换v[i]和v[j]*/
-
void swap(void *v[],int i, int j)
-
{
-
void *temp;
-
-
temp = v[i];
-
v[i] = v[j];
-
v[j] = temp;
-
}
-
Tags: C语言
Posted in C语言 | 688 Comments
Thu, 29 May 2008 04:37:59 +0800
刚发现有这样适合 programmer的BLOG!
就把我今天刚作的C语言的小练习方上来看看先~~
初学编程,练习是 The C programming language 里的
练习5-14
请指教...
-
/*对输入文本进行排序,
-
*nqsort -n -r
-
*其中参数 -n 是按数值排序, -r是逆序
-
* *exercise.5-13.in 《The C Programming Language》,page102 */
-
-
#include <stdio.h>
-
#include <string.h>
-
#include <stdlib.h>
-
-
#define MAXLINES 5000
-
char *lineptr[MAXLINES];
-
-
int readlines(char *lineptr[],int nlines);
-
void writelines(char *lineptr[], int nlines);
-
void swap(void *v[],int i, int j);
-
-
void nqsort(void *lineptr[],int left, int right,int argument,
-
int (*comp)(void *, void *));
-
int numcmp(char *, char *);
-
-
int main(int argc, char **argv)
-
{
-
int c;
-
int nlines = 0;
-
int numeric = 0,reverse = 0;
-
-
while(--argc > 0 && *(++argv)[0] == '-')
-
while((c = *++argv[0]))
-
switch(c){
-
case 'n':
-
numeric = 1;
-
break;
-
case 'r':
-
reverse = 1;
-
break;
-
default:
-
printf("nnqsort: illegal option %c \n",c);
-
argc = 0;
-
break;
-
}
-
printf("n:%d\n r:%d\n",numeric,reverse);
-
if(argc != 0)
-
printf("Usage: nqort -n -r \n");
-
else{
-
if((nlines = readlines(lineptr,MAXLINES)) >= 0) {
-
nqsort((void **)lineptr,0,nlines-1,reverse,
-
(int (*)(void *, void *))(numeric ? numcmp : strcmp));
-
writelines(lineptr, nlines);
-
return 0;
-
}else {
-
printf("input too big to sort\n");
-
return 1;
-
}
-
}
-
return 0;
-
}
-
Tags: C语言
Posted in C语言 | 2758 Comments