TIM G2
jQury datatables plugins 中文排序

对二补码

TLHL28 posted @ Mon, 15 Mar 2010 08:04:39 +0800 in 随笔 with tags C语言 , 2347 readers

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

下面这个是 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.
 

Avatar_small
TLHL28 said:
Mon, 15 Mar 2010 08:09:56 +0800

呃...还有未翻译完的....那个完全不懂..当时..现在懒得看了》。。。。

Avatar_small
G-one said:
Sat, 03 Apr 2010 19:36:54 +0800

补码直接取反加一就是啦,不用理解那么复杂吧

Avatar_small
G-one said:
Sat, 03 Apr 2010 19:43:42 +0800

正数的话就是它源码。关于正负数的表达,还有个最高位作为标示的

Avatar_small
TLHL28 said:
Sat, 10 Apr 2010 10:03:59 +0800

呃...我是翻译别人的.
应该不叫复杂吧.本来如此.这个是我当初入门时拿来理解的.要详细点.

Avatar_small
G-one said:
Sun, 11 Apr 2010 03:35:27 +0800

数字系统方面的书都有很详细的解释的

Avatar_small
TLHL28 said:
Sun, 11 Apr 2010 10:38:26 +0800

= =. 我学个C语言编程, 还是入门.....


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter