Fixed bugs in asInt64 and asUInt64.
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index 7c450ba..0819f3e 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -766,7 +766,7 @@
       return value_.uint_;
    case realValue:
       JSON_ASSERT_MESSAGE( value_.real_ >= minInt64  &&  value_.real_ <= maxInt64, "Real out of Int64 range" );
-      return Int( value_.real_ );
+      return Int64( value_.real_ );
    case booleanValue:
       return value_.bool_ ? 1 : 0;
    case stringValue:
@@ -794,7 +794,7 @@
       return value_.uint_;
    case realValue:
       JSON_ASSERT_MESSAGE( value_.real_ >= 0  &&  value_.real_ <= maxUInt64,  "Real out of UInt64 range" );
-      return UInt( value_.real_ );
+      return UInt64( value_.real_ );
    case booleanValue:
       return value_.bool_ ? 1 : 0;
    case stringValue:
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index 37393c8..07b1495 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -427,6 +427,67 @@
    JSONTEST_ASSERT( double(kuint64max) == val.asDouble());
    JSONTEST_ASSERT( float(kuint64max) == val.asFloat());
 #else  // ifdef JSON_NO_INT64
+   // 2^40 (signed constructor arg)
+   val = Json::Value(1LL << 40);
+
+   checks = IsCheck();
+   checks.isInt_ = true;
+   checks.isNumeric_ = true;
+   checks.isIntegral_ = true;
+   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
+
+   JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
+   JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
+
+   // 2^40 (unsigned constructor arg)
+   val = Json::Value(1ULL << 40);
+
+   checks = IsCheck();
+   checks.isUInt_ = true;
+   checks.isNumeric_ = true;
+   checks.isIntegral_ = true;
+   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
+
+   JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
+   JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
+
+   // 2^40 (floating-point constructor arg)
+   val = Json::Value((1LL << 40) / 1.0);
+
+   checks = IsCheck();
+   checks.isDouble_ = true;
+   checks.isNumeric_ = true;
+   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
+
+   JSONTEST_ASSERT( (1LL << 40) == val.asInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asUInt64());
+   JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt());
+   JSONTEST_ASSERT( (1LL << 40) == val.asDouble());
+   JSONTEST_ASSERT( (1LL << 40) == val.asFloat());
+
+   // -2^40
+   val = Json::Value(-(1LL << 40));
+
+   checks = IsCheck();
+   checks.isInt_ = true;
+   checks.isNumeric_ = true;
+   checks.isIntegral_ = true;
+   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
+
+   JSONTEST_ASSERT( -(1LL << 40) == val.asInt64());
+   JSONTEST_ASSERT( -(1LL << 40) == val.asLargestInt());
+   JSONTEST_ASSERT( -(1LL << 40) == val.asDouble());
+   JSONTEST_ASSERT( -(1LL << 40) == val.asFloat());
+
    // int64 max
    val = Json::Value(Json::Int64(kint64max));