The C programming language (second edition,KR) exercise(CHAPTER 2)

2024-04-11 15:36

本文主要是介绍The C programming language (second edition,KR) exercise(CHAPTER 2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      E x c e r c i s e 2 − 1 Excercise\quad 2-1 Excercise21:输出结果如图1和图2所示,这道练习题需要文章1和文章2的知识。

#include <stdio.h>
#include <limits.h>float getFloat(char sign, unsigned char exp, unsigned mantissa);
double getDouble(char sign, unsigned short exp, unsigned long long mantissa);int main(void)
{printf("sizeof(char)=%d\n",sizeof(char));printf("Signed char[%d to %d]\n", (~(((unsigned char)~0) >> 1)), (unsigned char)(((unsigned char)~0 >> 1)));printf("Unsigned char[0 to %u]\n", ((unsigned char)~0));		printf("sizeof(short)=%d\n",sizeof(short));printf("Signed short[%d to %d]\n", (~(((unsigned short)~0) >> 1)), (unsigned short)(((unsigned short)~0 >> 1)));printf("Unsigned short[0 to %u]\n", (unsigned short)((unsigned short)~0));printf("sizeof(int)=%d\n",sizeof(int));printf("Signed int[%d to %d]\n", (unsigned int)(~(((unsigned int)~0) >> 1)), (unsigned int)(((unsigned int)~0 >> 1)));printf("Unsigned int[0 to %u]\n", (unsigned int)((unsigned int)~0));printf("sizeof(long)=%d\n",sizeof(long));printf("Signed long[%ld to %ld]\n",(unsigned long)(~(((unsigned long)~0) >> 1)), (unsigned long)(((unsigned long)~0 >> 1)));printf("Unsigned long[0 to %lu]\n",(unsigned long)((unsigned long)~0));printf("sizeof(long long)=%d\n",sizeof(long long));printf("Signed long long[%lld to %lld]\n", (unsigned long long)(~(((unsigned long long)~0) >> 1)), (unsigned long long)(((unsigned long long)~0 >> 1)));printf("Unsigned long long[0 to %llu]\n", (unsigned long long)((unsigned long long)~0));printf("---------------------------------------------------------------\n");printf("Signed char[%d to %d]\n", SCHAR_MIN, SCHAR_MAX);printf("Unsigned char[0 to %u]\n", UCHAR_MAX);		printf("---------------------------------------------------------------\n");printf("Signed short[%d to %d]\n", SHRT_MIN, SHRT_MAX);printf("Unsigned short[0 to %u]\n", USHRT_MAX);printf("---------------------------------------------------------------\n");printf("Signed int[%d to %d]\n", INT_MIN, INT_MAX);printf("Unsigned int[0 to %u]\n", UINT_MAX);printf("---------------------------------------------------------------\n");printf("Signed long[%ld to %ld]\n",LONG_MIN, LONG_MAX);printf("Unsigned long[0 to %lu]\n",ULONG_MAX);printf("---------------------------------------------------------------\n");printf("Signed long long[%lld to %lld]\n", LLONG_MIN, LLONG_MAX);printf("Unsigned long long[0 to %llu]\n", ULLONG_MAX);printf("---------------------------------------------------------------\n");printf("Positive Normalized Float[%g to %g]\n", getFloat(0, 0x01, 0x00000000), getFloat(0, 0xFE, 0x007FFFFF));printf("Negative Normalized Float[%g to %g]\n", getFloat(1, 0xFE, 0x007FFFFF), getFloat(1, 0x01, 0x00000000));printf("Positive De-Normalized Float[%g to %g]\n", getFloat(0, 0x00, 0x00000001), getFloat(0, 0x00, 0x007FFFFF));printf("Negative De-Normalized Float[%g to %g]\n", getFloat(1, 0x00, 0x007FFFFF), getFloat(1, 0x00, 0x00000001));printf("Positive De-Normalized Zero Float[%g]\n", getFloat(0, 0x00, 0x00000000));printf("Negative De-Normalized Zero Float[%g]\n", getFloat(1, 0x00, 0x00000000));printf("Positive Infinity Float[%g]\n", getFloat(0, 0xFF, 0x00000000));printf("Negative Infinity Float[%g]\n", getFloat(1, 0xFF, 0x00000000));	printf("Not A Number Float[%g]\n", getFloat(0, 0xFF, 0x00000010));		printf("Not A Number Float[%g]\n", getFloat(1, 0xFF, 0x00000001));		printf("Positive Normalized Double[%g to %g]\n", getDouble(0, 0x0001, 0x0000000000000000), getDouble(0, 0x07FE, 0x000FFFFFFFFFFFFF));printf("Negative Normalized Double[%g to %g]\n", getDouble(1, 0x07FE, 0x000FFFFFFFFFFFFF), getDouble(1, 0x0001, 0x0000000000000000));printf("Positive De-Normalized Double[%g to %g]\n", getDouble(0, 0x0000, 0x0000000000000001), getDouble(0, 0x0000, 0x000FFFFFFFFFFFFF));printf("Negative De-Normalized Double[%g to %g]\n", getDouble(1, 0x0000, 0x000FFFFFFFFFFFFF), getDouble(1, 0x0000, 0x0000000000000001));printf("Positive De-Normalized Zero Double[%g]\n", getDouble(0, 0x0000, 0x0000000000000000));printf("Negative De-Normalized Zero Double[%g]\n", getDouble(1, 0x0000, 0x0000000000000000));printf("Positive Infinity Double[%g]\n", getDouble(0, 0x07FF, 0x0000000000000000));printf("Negative Infinity Double[%g]\n", getDouble(1, 0x07FF, 0x0000000000000000));	printf("Not A Number Double[%g]\n", getDouble(0, 0x07FF, 0x0000000000000010));		printf("Not A Number Double[%g]\n", getDouble(1, 0x07FF, 0x0000000000000001));		return 0;
}float getFloat(char sign, unsigned char exp, unsigned mantissa)
{unsigned f = ((unsigned)(((unsigned)(sign != 0))) << 31) | ((unsigned)(((unsigned)exp) << 23)) | ((unsigned)(mantissa & 0x007FFFFF));return *((float *)&f);
}double getDouble(char sign, unsigned short exp, unsigned long long mantissa)
{unsigned long long d = ((unsigned long long)(((unsigned long long)(sign != 0)) << 63)) | ((unsigned long long)((unsigned long long)(exp & 0x07FF) << 52)) | ((unsigned long long)(mantissa & 0x000FFFFFFFFFFFFF));return *((double *)&d);
}
图1.
图2.

      E x c e r c i s e 2 − 2 Excercise\quad 2-2 Excercise22

#include <stdio.h>#define MAXLINE  (1000)int getline(char s[], int lim);int main()
{int len;    /* current line length */char line[MAXLINE];     /* current input line */while ((len = getline(line, MAXLINE)) > 0) {printf("%s",line);}return 0;
}/* getline: read a line s, return length */
int getline(char s[], int lim)
{int c, i;for (i = 0; i < lim-1; ++i){c = getchar();	if((c == '\n')){break;}else if((c== EOF)){break;}		else{s[i] = c;			}}if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}

      E x c e r c i s e 2 − 3 Excercise\quad 2-3 Excercise23

#include <stdio.h>#define MAXLINE  (1000)int getline(char s[], int lim);
int htoi(char s[]);int main()
{int result=0;int len;    /* current line length */char line[MAXLINE];     /* current input line */while ((len = getline(line, MAXLINE)) > 0) {printf("%s\n",line);result=htoi(line);printf("result=%d\n",result);		}return 0;
}int power(int ex)
{int i=0;int result=1;	while(i<ex){result=result*16;	i=i+1;		}return result;
}int htoi(char s[])
{int i=0;	int result=0;	int prefix=0;	int s_index=0;int e_index=0;while(s[i]!='\0'){if(((s[i]>='0')&&(s[i]<='9'))||((s[i]>='a')&&(s[i]<='f'))||((s[i]>='A')&&(s[i]<='F'))){}else{if(i==1){if(s[0]=='0'){if((s[1]=='x')||(s[1]=='X')){prefix=1;}else{printf("Hexadecimal string error\n");return -1;						}}else{printf("Hexadecimal string error\n");return -1;						}}else{printf("Hexadecimal string error\n");return -1;}			}i=i+1;			}	s_index=i;	if(s_index==0){printf("Hexadecimal string error\n");return -1;}if(s_index==1){if((s[i]>='0')&&(s[i]<='9')){return  ((int)(s[i]-'0'));	}		if((s[i]>='a')&&(s[i]<='f')){return  ((int)((s[i]-'a')+10));				}if((s[i]>='A')&&(s[i]<='F')){return  ((int)((s[i]-'A')+10));				}				}	if(s_index==2){		if(prefix==1){printf("Hexadecimal string error\n");return -1;	}else{for(i=0;i<s_index;i++){if((s[s_index-1-i]>='0')&&(s[s_index-1-i]<='9')){result=result +  ((int)(s[s_index-1-i]-'0')) *power(i);	}		if((s[s_index-1-i]>='a')&&(s[s_index-1-i]<='f')){result=result +  ((int)((s[s_index-1-i]-'a')+10)) *power(i);										}if((s[s_index-1-i]>='A')&&(s[s_index-1-i]<='F')){result=result +  ((int)((s[s_index-1-i]-'A')+10)) *power(i);									}					}					}					}if(s_index>2){		if(prefix==1){for(i=0;i<(s_index-2);i++){if((s[s_index-1-i]>='0')&&(s[s_index-1-i]<='9')){result=result +  ((int)(s[s_index-1-i]-'0')) *power(i);	}		if((s[s_index-1-i]>='a')&&(s[s_index-1-i]<='f')){result=result +  ((int)((s[s_index-1-i]-'a')+10)) *power(i);										}if((s[s_index-1-i]>='A')&&(s[s_index-1-i]<='F')){result=result +  ((int)((s[s_index-1-i]-'A')+10)) *power(i);									}					}					}	else{for(i=0;i<s_index;i++){if((s[s_index-1-i]>='0')&&(s[s_index-1-i]<='9')){result=result +  ((int)(s[s_index-1-i]-'0')) *power(i);	}		if((s[s_index-1-i]>='a')&&(s[s_index-1-i]<='f')){result=result +  ((int)((s[s_index-1-i]-'a')+10)) *power(i);										}if((s[s_index-1-i]>='A')&&(s[s_index-1-i]<='F')){result=result +  ((int)((s[s_index-1-i]-'A')+10)) *power(i);									}					}					}					}return result;
}/* getline: read a line s, return length */
int getline(char s[], int lim)
{int c, i;for (i = 0; i < lim-1; ++i){c = getchar();	if((c == '\n')){break;}else if((c== EOF)){break;}		else{s[i] = c;			}}if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}

      E x c e r c i s e 2 − 4 Excercise\quad 2-4 Excercise24

#include <stdio.h>#define MAXLINE  (1000)int getline(char s[], int lim);
void squeeze(char s1[],char s2[]);int main()
{int result=0;int len;    /* current line length */char line[MAXLINE];     /* current input line */while ((len = getline(line, MAXLINE)) > 0) {printf("before:%s\n",line);squeeze(line,"aFEb");printf("after:%s\n",line);		}return 0;
}int is_str_ch(char s[],char c)
{int i=0;char temp_c=0;	int result=0;	while((temp_c=s[i++])!='\0'){   if(temp_c==c){result=1;break;			}	}return result;
}void squeeze(char s1[],char s2[])
{int i,j;for(i=j=0;s1[i]!='\0';i++){			if(!is_str_ch(s2,s1[i])){s1[j++]=s1[i];		}				}s1[j]='\0';		
}/* getline: read a line s, return length */
int getline(char s[], int lim)
{int c, i;for (i = 0; i < lim-1; ++i){c = getchar();	if((c == '\n')){break;}else if((c== EOF)){break;}		else{s[i] = c;			}}if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}

      E x c e r c i s e 2 − 5 Excercise\quad 2-5 Excercise25

#include <stdio.h>#define MAXLINE  (1000)int getline(char s[], int lim);
int any(char s1[],char s2[]);int main()
{int position=0;int len;    /* current line length */char line[MAXLINE];     /* current input line */while ((len = getline(line, MAXLINE)) > 0) {position=any(line,"aFEb");printf("position=%d\n",position);		}return 0;
}int any(char s1[],char s2[])
{int i,j;for(i=0;s1[i]!='\0';i++){			for(j=0;s2[j]!='\0';j++){if(s1[i]==s2[j]){return i;				}				}				}return -1;		
}/* getline: read a line s, return length */
int getline(char s[], int lim)
{int c, i;for (i = 0; i < lim-1; ++i){c = getchar();	if((c == '\n')){break;}else if((c== EOF)){break;}		else{s[i] = c;			}}if (c == '\n') {s[i] = c;++i;}s[i] = '\0';return i;
}

      E x c e r c i s e 2 − 6 Excercise\quad 2-6 Excercise26

#include <stdio.h>unsigned setbits(unsigned x,int p,int n,unsigned y);int main()
{unsigned x=0xFFFFFFDF;unsigned y=0xFFFFFFF2;unsigned p=0;p=setbits(x,5,2,y);printf("p=%08x\n",p);		return 0;
}unsigned setbits(unsigned x,int p,int n,unsigned y)
{unsigned front=((~((unsigned)0))<<(p+1));unsigned back=~((~((unsigned)0))<<(p-n+1));unsigned all=front | back;	x=x & all;	y=(~((~0)<<n)) & y;y=y<<(p-n+1);x=x | y;return x;		
}

      E x c e r c i s e 2 − 7 Excercise\quad 2-7 Excercise27:

#include <stdio.h>unsigned invert(unsigned x,int p,int n);int main()
{unsigned x=0xFFFF55FF;unsigned inverted=0;inverted=invert(x,15,8);printf("inverted=%08x\n",inverted);		return 0;
}unsigned invert(unsigned x,int p,int n)
{int i;unsigned temp1_x=x & (~((~((~((unsigned)0))<<n))<<(p-n+1)));unsigned temp2_x=0;	unsigned index=1<<p;for(i=0;i<n;i++){if(!(index & x)){temp2_x|=index;			}			index=index>>1;		}return (temp1_x) | (temp2_x);		
}

      E x c e r c i s e 2 − 8 Excercise\quad 2-8 Excercise28:

#include <stdio.h>unsigned rightrot(unsigned x,int n);int main()
{unsigned x=0xFFFFFF5A;unsigned rotated=0;rotated=rightrot(x,8);printf("rotated=%08x\n",rotated);		return 0;
}unsigned rightrot(unsigned x,int n)
{unsigned temp1_x=x & (~((~((unsigned)0))<<n));temp1_x=temp1_x<<((sizeof(unsigned) * 8)-n);unsigned temp2_x=(x>>n) & ((~((unsigned)0)>>n));	return (temp1_x) | (temp2_x);		
}

      E x c e r c i s e 2 − 9 Excercise\quad 2-9 Excercise29:当 x x x为奇数的时候, x x x的二进制表示的最低位肯定为1,那么此时 x − 1 x-1 x1的值二进制表示和 x x x的二进制表示基本一样,除了二进制表示的最低位为0,那么此时操作 x & = ( x − 1 ) x\&=(x-1) x&=(x1)就会将 x x x的二进制表示的最低位清零,其它位保持不变。假设此时 x = 213 x=213 x=213,那么它的二进制表示为 11010101 11010101 11010101,此时 x − 1 x-1 x1的值二进制表示为 11010100 11010100 11010100,那么此时操作 x & = ( x − 1 ) x\&=(x-1) x&=(x1)之后 x x x的值为 11010100 11010100 11010100= x − 1 x-1 x1。当 x x x为偶数的时候, x − 1 x-1 x1会将 x x x的二进制表示的最右的比特值为1的比特位的值变成0,同时将 x x x的二进制表示的最右的比特值为1的比特位后面所有为0的比特位的值都变成1,因此总的来说操作 x & = ( x − 1 ) x\&=(x-1) x&=(x1)会将 x x x的二进制表示的最右的比特值为1的比特位清零,其它位保持不变。假设此时 x = 208 x=208 x=208,那么它的二进制表示为 11010000 11010000 11010000,此时 x − 1 x-1 x1的值二进制表示为 11001111 11001111 11001111,那么此时操作 x & = ( x − 1 ) x\&=(x-1) x&=(x1)之后 x x x的值为 11000000 11000000 11000000。因此总结来说不论 x x x为奇数还是偶数,操作 x & = ( x − 1 ) x\&=(x-1) x&=(x1)都会将 x x x的二进制表示的最右的比特值为1的比特位清零,因此可以利用这个现象来统计 x x x中比特位的值为1的比特位的个数。

#include <stdio.h>int bitcount(unsigned x);int main()
{unsigned x=0x84211234;unsigned num_of_1_bits=0;num_of_1_bits=bitcount(x);printf("num_of_1_bits=%d\n",num_of_1_bits);		return 0;
}/* bitcount:  count 1 bits in x */
int bitcount(unsigned x)
{int b;for (b = 0; x != 0; x &= (x-1))b++;return b;
}

      E x c e r c i s e 2 − 10 Excercise\quad 2-10 Excercise210:

#include <stdio.h>char lower(char c);int main()
{char c='A';printf("lower(c)=%c\n",lower(c));		return 0;
}/* lower:  convert c to lower case: ASCII only */
char lower(char c)
{return ((c>='A' && c<='Z') ? (c-'A'+'a'):c);
}

这篇关于The C programming language (second edition,KR) exercise(CHAPTER 2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894484

相关文章

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

UML- 统一建模语言(Unified Modeling Language)创建项目的序列图及类图

陈科肇 ============= 1.主要模型 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功能,包括用例图。 对象模型:采用对象、属性、操作、关联等概念展示系统的结构和基础,包括类图、对象图、包图。 动态模型:展现系统的内部行为。 包括序列图、活动图、状态图。 因为要创建个人空间项目并不是一个很大的项目,我这里只须关注两种图的创建就可以了,而在开始创建UML图

速通GPT-3:Language Models are Few-Shot Learners全文解读

文章目录 论文实验总览1. 任务设置与测试策略2. 任务类别3. 关键实验结果4. 数据污染与实验局限性5. 总结与贡献 Abstract1. 概括2. 具体分析3. 摘要全文翻译4. 为什么不需要梯度更新或微调⭐ Introduction1. 概括2. 具体分析3. 进一步分析 Approach1. 概括2. 具体分析3. 进一步分析 Results1. 概括2. 具体分析2.1 语言模型

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

Chapter 10 Stability and Frequency Compensation

Chapter 10 Stability and Frequency Compensation Chapter 8介绍了负反馈, 这一章介绍稳定性, 如果设计不好, 负反馈系统是要发生震荡的. 首先我们学习理解稳定判断标准和条件, 然后学习频率补偿, 介绍适用于不同运放的补偿方式, 同时介绍不同补偿对两级运放slew rate的影响, 最后介绍Nyquist’s判断标准 10.1 Gener

Computer Exercise

每日一练 单选题 在计算机机箱前面板接口插针上(     C   )表示复位开关。 A.SPK    B.PWRLED    C.RESET    D.HDDLED每台PC机最多可接(     B   )块IDE硬盘。 A.2    B.4    C.6    D.8(     B   )拓扑结构由连接成封闭回路的网络结点组成的,每一结点与它左右相邻的结点连接。 A.总线型    B

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言 今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 密集检索需要学习具有区分性的文本嵌入,以表示查询和文档之间的语义关系。考虑到大语言模

[学习笔记]《CSAPP》深入理解计算机系统 - Chapter 3 程序的机器级表示

总结一些第三章的一些关键信息 Chapter 3 程序的机器级表示结构 updating... Chapter 3 程序的机器级表示 局部变量通常保存在寄存器中,而不是内存中,访问寄存器比内存快的多. 有些时候,局部数据必须存放在内存中, 寄存器不足够存放所有的本地数据对一个局部变量使用地址运算符 &, 因此必须能够为它产生一个地址某些局部变量是数组或结构,因此必须能够通过数组或