原码、反码和补码
几年前就思考的问题,很久没看有点陌生了,今天开始学习java遇到了这个问题,重新查找了些资料,看完有了更深刻的理解。无符号整数无所谓反码、补码之说,但是对于符号整数计算机采用补码可以提高cpu的处理效率。数值单元最高位是符号位,指示该数是正还是负,对于正整数原码、反码、补码都是一样的,而负整数就有区别了,反码是原码除最高位外其余所有位的逐位求反, 将反码加上1就得到补码。下面以8位数值单位来举例,例如:用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对
颇具艺术感的代码
编程真是蕴藏着无穷的想象,好的程序员就像艺术家一样雕刻他的代码,keyboard就是罗丹手中的小刀,一行行的代码就是陈列着的雕像。编程到底是不是艺术已经快变成继编程语言和Emacs vs Vi之后另一Flame War话题。有兴趣的可以去看reddit的讨论。且看Joe Marshall论证编程是艺术的文章上一段代码。实现一个带三个参数的函数。这个函数返回三个参数中最大的两个参数的平方和。 题目用来训练学生对条件分支的理解。常规的解法是(define (sum-square-largest x y z) (cond ((and (> y x) (> z x)) ;; y and z are largest (
堆和栈在程序中的比较
曾经有人问过我编译器怎样处理堆与栈的,那时真的不知怎么回事。今天在网上找到些资料,当即消化了一下,日后再看看,摘下来当资料。不知源作者是谁。姑且“拿来主义”一下,呵呵。一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全