From 289430e8eceaa8a9f541e455f0ffb8186ba06acd Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 15 Feb 2002 04:43:58 +0000 Subject: * bignum.c (rb_big_rshift): should properly convert the nagative value to 2's compliment. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2072 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- bignum.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index d59969cdd9..90a4c77012 100644 --- a/bignum.c +++ b/bignum.c @@ -1468,12 +1468,17 @@ rb_big_rshift(x, y) long j; if (shift < 0) return rb_big_lshift(x, INT2FIX(-shift)); + if (s1 > RBIGNUM(x)->len) { if (RBIGNUM(x)->sign) return INT2FIX(0); else return INT2FIX(-1); } + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + rb_big_2comp(x); + } xds = BDIGITS(x); i = RBIGNUM(x)->len; j = i - s1; z = bignew(j, RBIGNUM(x)->sign); @@ -1483,6 +1488,9 @@ rb_big_rshift(x, y) zds[j] = BIGLO(num); num = BIGUP(xds[i]); } + if (!RBIGNUM(x)->sign) { + rb_big_2comp(z); + } return bignorm(z); } -- cgit v1.2.3