diff --git generic/tclStrToD.c generic/tclStrToD.c
index 372fe773..7e3574f5 100644
--- generic/tclStrToD.c
+++ generic/tclStrToD.c
@@ -1312,7 +1312,7 @@ TclParseNumber(
 			objPtr->typePtr = &tclWideIntType;
 			if (signum) {
 			    objPtr->internalRep.wideValue =
-				    - (Tcl_WideInt) octalSignificandWide;
+				    (Tcl_WideInt) (0-octalSignificandWide);
 			} else {
 			    objPtr->internalRep.wideValue =
 				    (Tcl_WideInt) octalSignificandWide;
@@ -1327,7 +1327,7 @@ TclParseNumber(
 		    objPtr->typePtr = &tclIntType;
 		    if (signum) {
 			objPtr->internalRep.longValue =
-				- (long) octalSignificandWide;
+				(long) (0-octalSignificandWide);
 		    } else {
 			objPtr->internalRep.longValue =
 				(long) octalSignificandWide;
@@ -1359,7 +1359,7 @@ TclParseNumber(
 			objPtr->typePtr = &tclWideIntType;
 			if (signum) {
 			    objPtr->internalRep.wideValue =
-				    - (Tcl_WideInt) significandWide;
+				    (Tcl_WideInt) (0-significandWide);
 			} else {
 			    objPtr->internalRep.wideValue =
 				    (Tcl_WideInt) significandWide;
@@ -1374,7 +1374,7 @@ TclParseNumber(
 		    objPtr->typePtr = &tclIntType;
 		    if (signum) {
 			objPtr->internalRep.longValue =
-				- (long) significandWide;
+				(long) (0-significandWide);
 		    } else {
 			objPtr->internalRep.longValue =
 				(long) significandWide;
