计算机组织与体系结构——补码与模与浮点数的规格化
摘要部分
简单介绍一下模与补码的关系,通过探究补码计算的原理加深印象和理解,借此顺便分析一下浮点数的规格化中对尾数的要求(即怎样才算规格化的浮点数)
模2与模4补码
首先明确一点,通常我们所见到的就是模2,而模4最常见的使用即双符号位,在解题时,一般理解为双符号位即可。
下面简单分析一下模的概念,以时钟为例,时钟是最方便我们理解的模12的一个例子,即在时钟中,1和1(+12)所表示的东西是等价的,事实上和任意加上12n的数都是等价的。
在计算机中,补码的出现很大程度上是为了表示负数,我们来看-36这个数,其绝对值的二进制是100100,假设现在在8位的计算机中表示,即0010 0100,负的相当于拿0减去它,根据我们小学数学的思想,不够减,向高位借1,如下所示:
1 0000 0000
-0 0010 0100
————————————————————
0 1101 1100
而熟悉补码计算方法的同学肯定知道取反加一之后的结果:
1 010 0100-->1 101 1011-->1 101 1100
很容易发 ...
人工智能导论-确定性推理之消解反演
人工智能导论,举一些消解反演的例子,分析消解反演的步骤。由于公式的表示较为麻烦,这里全部手写,字丑见谅。
例题分析
注意答题的时候分四步
定义谓词
谓词公式
子句集
把谓词公式化成子句集的步骤:
消去—>,公式:P—>Q转化为~P∨Q
利用等价关系把“~”移到紧靠谓词的位置上
对变量标准化,使不同量词约束的变元有不同的名字
消去存在量词
化为前束形,提取全称量词,全部移到公式的最左边
利用等价关系 P∨(Q∧R) ⇔(P∨Q) ∧ (P∨R) 把母式化为合取范式。
消去全称量词
对变元更名,使不同子句中的变元不同名
消去合取词,得到子句集
(注意NIL不要写成NULL)
归结
注意:存在后面不能够跟蕴含!用析取!例如:有些男生不爱踢足球,不能用(∃x)(Boy(x)—>~Play(x,football)),要用(∃x) (Boy(x)∧~Play(x,football))。
人工智能导论-知识表示之谓词公式
人工智能导论,举一些知识表示成谓词公式的例子,由于公式的表示较为麻烦,这里全部手写,字丑见谅,咕~。
例题分析
注意答题的时候分两步
定义谓词
谓词公式
linux网络编程-地址转换
linux网络编程-常用IP地址转换
代码分析 client.c
程序分析client.c
//Example Program source of inet_pton
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
unsigned char buf[sizeof(struct in6_addr)];
int domain, s;
char str[INET6_ADDRSTRLEN];
if (argc != 3)
{
fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
exit(EXIT_FAILURE);
}
domain = (strcmp(argv[1], ...
linux网络编程-TCP套接字编程典型模型(select多路复用)
linux网络编程-TCP套接字通信实验,多路复用
代码分析 client.c
程序分析client.c
//client.c
//
// TCP 套接字编程典型模型
//
// 客户端 服务器端
// 创建套接字(socket) 创建套接字(socket)
// 绑定服务器地址和端口(bind)
// 监听端口(listen)
// 连接服务器(connect) ----> 接受客户端连接(accept)
// 客户端发送请求(send) ----> 接收客户端请求(recv)
// 客户端接收响应(recv) <---- 回送响应(send)
// 关闭套接字(close) <---> 关闭套接字(close)
//man 7 socket
//accept() , bind() , connect() , getsockname() , getsockopt() ,
//listen() , recv() , recvfrom() , r ...
linux网络编程-UDP套接字编程典型模型
linux网络编程-UDP套接字通信实验,注意和上一篇文章的区分(TCP编程)
代码分析 client.c
程序分析client.c
//client.c
//
// UDP 套接字编程典型模型
//
// 客户端 服务器端
// 创建套接字(socket) 创建套接字(socket)
// 绑定服务器地址和端口(bind)
// 客户端发送请求(sendto) ----> 接收客户端请求(recvfrom)
// 客户端接收响应(recvfrom)<---- 回送响应(sendto)
// 关闭套接字(close)
//man 7 socket
//accept() , bind() , connect() , getsockname() , getsockopt() ,
//listen() , recv() , recvfrom() , recvmsg() , send() , sendmsg() ,
//sendto() , setsockopt() , shutdown() , socket() , soc ...
linux进程间通信编程-共享内存
linux 进程间通信编程,共享内存的实验
代码分析
程序分析
共享内存实现的步骤大体如下:
创建共享内存对象,shm_open
分配共享内存大小,ftruncate
映射共享内存(到具体的进程空间),mmap
//producer_customer.c
//在多线程中
//使用SYSTEM V API实现生产者消费者经典程序
//实际上这是POSIX的实现方法,上面那句话可能有误?
#include <signal.h>
#include "shm_com.h"
#include "sem_com.h"
#include <pthread.h>
#define SHM_NAME "/MY_SHM"
int semid ; //信号量id
char *shm_addr = NULL; //共享内存映射地址
struct shm_buf *shm_buf_inst = NULL;
int ignore_signal(void)
{ //忽略部分信号,避免程序非法 ...
linux进程间通信编程-有名管道
linux 进程间通信编程,有名管道的实验(存疑,为什么管道的创建在read.c里?)
代码分析
程序分析 write.c
//fifo_write.c
//有名管道的创建与使用write部分
// mkfifo - make a FIFO special file (a named pipe)
//#include <sys/types.h>
//#include <sys/stat.h>
//int mkfifo(const char *pathname, mode_t mode);
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <limits.h>
#define FIFONAME "./myfifo"
// PIPE_BUF ...
linux进程间通信编程-管道通信
linux 进程间通信编程,管道通信的实验
代码分析
程序分析
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <sys/types.h> //mkfifo
#include <sys/stat.h> //mkfifo
// 定义FIFO有名管道名
#define FIFO1 "in1"
#define FIFO2 "in2"
//设定缓冲区大小
#define BUF_SIZE 512
//超时时间
#define DELAY_TIME 60
//多路复用文件数目
#define IN_FILES 3
#define MAX(a,b) ((a) > (b)? (a) : (b)) ...
linux进程控制编程-fork()函数
linux进程控制编程,通过一个相对复杂程序分析fork()函数
代码分析
程序分析
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int i=0, k=0;
for(i=0;i<2;i++)
{
pid_t fpid=fork();
if(fpid==0)
{
printf("son, %d, */n", ++k);
}
else
{
printf("father, %d, */n", ++k);
}
}
return 0;
}
执行结果
父子进程之间顺序无需关注,每次执行都不尽相同,主要理清其间关系,以我的某次执行结果为例: 下面是我手绘的解释图,字丑见谅,同样也是先存到缓冲区,最后一并输出