diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 280a99a..34d4dbc 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -3387,7 +3387,7 @@
 typedef QCBORError (*fExponentiator)(uint64_t uMantissa, int64_t nExponent, uint64_t *puResult);
 
 
-// The main exponentiator that works on only positive numbers
+// The exponentiator that works on only positive numbers
 static QCBORError Exponentitate10(uint64_t uMantissa, int64_t nExponent, uint64_t *puResult)
 {
    uint64_t uResult = uMantissa;
@@ -3419,11 +3419,7 @@
 }
 
 
-/* Convert a decimal fraction to an int64_t without using
- floating point or math libraries.  Most decimal fractions
- will not fit in an int64_t and this will error out with
- under or overflow
- */
+// The exponentiator that works on only positive numbers
 static QCBORError Exponentitate2(uint64_t uMantissa, int64_t nExponent, uint64_t *puResult)
 {
    uint64_t uResult;
@@ -3432,7 +3428,7 @@
 
    /* This loop will run a maximum of 64 times because
     * INT64_MAX < 2^31. More than that will cause
-    * exist with the overflow error
+    * exit with the overflow error
     */
    while(nExponent > 0) {
       if(uResult > UINT64_MAX >> 1) {
@@ -3455,10 +3451,14 @@
    return QCBOR_SUCCESS;
 }
 
+
 /*
  Compute value with signed mantissa and signed result. Works with exponent of 2 or 10 based on exponentiator.
  */
-static inline QCBORError ExponentiateNN(int64_t nMantissa, int64_t nExponent, int64_t *pnResult, fExponentiator pfExp)
+static inline QCBORError ExponentiateNN(int64_t       nMantissa,
+                                        int64_t       nExponent,
+                                        int64_t       *pnResult,
+                                        fExponentiator pfExp)
 {
    uint64_t uResult;
 
@@ -3493,10 +3493,14 @@
    return QCBOR_SUCCESS;
 }
 
+
 /*
  Compute value with signed mantissa and unsigned result. Works with exponent of 2 or 10 based on exponentiator.
  */
-static inline QCBORError ExponentitateNU(int64_t nMantissa, int64_t nExponent, uint64_t *puResult, fExponentiator pfExp)
+static inline QCBORError ExponentitateNU(int64_t       nMantissa,
+                                         int64_t       nExponent,
+                                         uint64_t      *puResult,
+                                         fExponentiator pfExp)
 {
    if(nMantissa < 0) {
       return QCBOR_ERR_NUMBER_SIGN_CONVERSION;
@@ -3507,6 +3511,19 @@
    // Exponentiation is straight forward
    return (*pfExp)((uint64_t)nMantissa, nExponent, puResult);
 }
+
+
+/*
+ Compute value with signed mantissa and unsigned result. Works with exponent of 2 or 10 based on exponentiator.
+ */
+static inline QCBORError ExponentitateUU(uint64_t       uMantissa,
+                                         int64_t        nExponent,
+                                         uint64_t      *puResult,
+                                         fExponentiator pfExp)
+{
+   return (*pfExp)(uMantissa, nExponent, puResult);
+}
+
 #endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
 
 
@@ -3533,11 +3550,13 @@
    return QCBOR_SUCCESS;
 }
 
+
 static inline QCBORError ConvertPositiveBigNumToUnsigned(const UsefulBufC BigNum, uint64_t *pResult)
 {
    return ConvertBigNumToUnsigned(BigNum, UINT64_MAX, pResult);
 }
 
+
 static inline QCBORError ConvertPositiveBigNumToSigned(const UsefulBufC BigNum, int64_t *pResult)
 {
    uint64_t uResult;
@@ -3551,26 +3570,32 @@
 }
 
 
-static inline QCBORError ConvertNegativeBigNumToSigned(const UsefulBufC BigNum, int64_t *pResult)
+static inline QCBORError ConvertNegativeBigNumToSigned(const UsefulBufC BigNum, int64_t *pnResult)
 {
    uint64_t uResult;
-   /* negaative int furthest from zero is INT64_MIN
-      which is expressed as -INT64_MAX-1. The value of
-    a negative bignum is -n-1, one further from zero
-    than the positive bignum */
+   /* The negative integer furthest from zero for a C int64_t is
+    INT64_MIN which is expressed as -INT64_MAX - 1. The value of a
+    negative number in CBOR is computed as -n - 1 where n is the
+    encoded integer, where n is what is in the variable BigNum. When
+    converting BigNum to a uint64_t, the maximum value is thus
+    INT64_MAX, so that when it -n - 1 is applied to it the result will
+    never be further from 0 than INT64_MIN.
 
-   /* say INT64_MIN is -2; then INT64_MAX is 1.
-    Then -n-1 <= INT64_MIN.
-    Then -n -1 <= -INT64_MAX - 1
-    THen n <= INT64_MAX. */
+       -n - 1 <= INT64_MIN.
+       -n - 1 <= -INT64_MAX - 1
+        n     <= INT64_MAX.
+    */
    QCBORError uError = ConvertBigNumToUnsigned(BigNum, INT64_MAX, &uResult);
-   if(uError) {
+   if(uError != QCBOR_SUCCESS) {
       return uError;
    }
-   /* Cast is safe because ConvertBigNum is told to limit to INT64_MAX */
-   // TODO: this code is incorrect. See RFC 7049
-   uResult++; // this is the -1 in -n-1
-   *pResult = -(int64_t)uResult;
+
+   /// Now apply -n - 1. The cast is safe because
+   // ConvertBigNumToUnsigned() is limited to INT64_MAX which does fit
+   // is the largest positive integer that an int64_t can
+   // represent. */
+   *pnResult =  -(int64_t)uResult - 1;
+
    return QCBOR_SUCCESS;
 }
 
@@ -3700,7 +3725,6 @@
 }
 
 
-
 /*
  Convert a large variety of integer types to an int64_t.
 
@@ -3725,7 +3749,7 @@
          }
          break;
 
-         case QCBOR_TYPE_NEGBIGNUM:
+      case QCBOR_TYPE_NEGBIGNUM:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_BIG_NUM) {
             return ConvertNegativeBigNumToSigned(pItem->val.bigNum, pnValue);
          } else {
@@ -3737,20 +3761,20 @@
       case QCBOR_TYPE_DECIMAL_FRACTION:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
             return ExponentiateNN(pItem->val.expAndMantissa.Mantissa.nInt,
-                                                      pItem->val.expAndMantissa.nExponent,
-                                                      pnValue,
-                                                      &Exponentitate10);
+                                  pItem->val.expAndMantissa.nExponent,
+                                  pnValue,
+                                 &Exponentitate10);
          } else {
             return QCBOR_ERR_UNEXPECTED_TYPE;
          }
          break;
 
-         case QCBOR_TYPE_BIGFLOAT:
+      case QCBOR_TYPE_BIGFLOAT:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_BIGFLOAT) {
             return ExponentiateNN(pItem->val.expAndMantissa.Mantissa.nInt,
-                                                      pItem->val.expAndMantissa.nExponent,
-                                                      pnValue,
-                                                      Exponentitate2);
+                                  pItem->val.expAndMantissa.nExponent,
+                                  pnValue,
+                                  Exponentitate2);
          } else {
             return QCBOR_ERR_UNEXPECTED_TYPE;
          }
@@ -3857,7 +3881,10 @@
 /*
 Public function, see header qcbor/qcbor_decode.h file
 */
-void QCBORDecode_GetInt64ConvertAllInMapN(QCBORDecodeContext *pMe, int64_t nLabel, uint32_t uConvertTypes, int64_t *pnValue)
+void QCBORDecode_GetInt64ConvertAllInMapN(QCBORDecodeContext *pMe,
+                                          int64_t             nLabel,
+                                          uint32_t            uConvertTypes,
+                                          int64_t            *pnValue)
 {
    QCBORItem Item;
 
@@ -3880,7 +3907,10 @@
 /*
 Public function, see header qcbor/qcbor_decode.h file
 */
-void QCBORDecode_GetInt64ConvertAllInMapSZ(QCBORDecodeContext *pMe, const char *szLabel, uint32_t uConvertTypes, int64_t *pnValue)
+void QCBORDecode_GetInt64ConvertAllInMapSZ(QCBORDecodeContext *pMe,
+                                           const char         *szLabel,
+                                           uint32_t            uConvertTypes,
+                                           int64_t            *pnValue)
 {
    QCBORItem Item;
    QCBORDecode_GetInt64ConvertInternalInMapSZ(pMe, szLabel, uConvertTypes, pnValue, &Item);
@@ -3902,56 +3932,57 @@
 static QCBORError ConvertUint64(const QCBORItem *pItem, uint32_t uConvertTypes, uint64_t *puValue)
 {
    switch(pItem->uDataType) {
-        case QCBOR_TYPE_DOUBLE:
-        case QCBOR_TYPE_FLOAT:
+      case QCBOR_TYPE_DOUBLE:
+      case QCBOR_TYPE_FLOAT:
 #ifndef QCBOR_DISABLE_FLOAT_HW_USE
-           if(uConvertTypes & QCBOR_CONVERT_TYPE_FLOAT) {
-              // TODO: this code needs work
-              feclearexcept(FE_ALL_EXCEPT);
-              double dRounded = round(pItem->val.dfnum);
-              // TODO: over/underflow
-              if(fetestexcept(FE_INVALID)) {
-                 // TODO: better error code
-                 return QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW;
-              } else if(isnan(dRounded)) {
-                 // TODO: better error code
-                 return QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW;
-              } else if(dRounded >= 0) {
-                 *puValue = (uint64_t)dRounded;
-              } else {
-                 return QCBOR_ERR_NUMBER_SIGN_CONVERSION;
-              }
-           } else {
-              return QCBOR_ERR_UNEXPECTED_TYPE;
-           }
+         if(uConvertTypes & QCBOR_CONVERT_TYPE_FLOAT) {
+            // TODO: this code needs work
+            feclearexcept(FE_ALL_EXCEPT);
+            double dRounded = round(pItem->val.dfnum);
+            // TODO: over/underflow
+            if(fetestexcept(FE_INVALID)) {
+               // TODO: better error code
+               return QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW;
+            } else if(isnan(dRounded)) {
+               // TODO: better error code
+               return QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW;
+            } else if(dRounded >= 0) {
+               *puValue = (uint64_t)dRounded;
+            } else {
+               return QCBOR_ERR_NUMBER_SIGN_CONVERSION;
+            }
+         } else {
+            return QCBOR_ERR_UNEXPECTED_TYPE;
+         }
 #else
          return QCBOR_ERR_HW_FLOAT_DISABLED;
 #endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-           break;
+         break;
 
-        case QCBOR_TYPE_INT64:
-           if(uConvertTypes & QCBOR_CONVERT_TYPE_XINT64) {
-              if(pItem->val.int64 >= 0) {
-                 *puValue = (uint64_t)pItem->val.int64;
-              } else {
-                 return QCBOR_ERR_NUMBER_SIGN_CONVERSION;
-              }
-           } else {
-              return QCBOR_ERR_UNEXPECTED_TYPE;
-           }
-           break;
+      case QCBOR_TYPE_INT64:
+         if(uConvertTypes & QCBOR_CONVERT_TYPE_XINT64) {
+            if(pItem->val.int64 >= 0) {
+               *puValue = (uint64_t)pItem->val.int64;
+            } else {
+               return QCBOR_ERR_NUMBER_SIGN_CONVERSION;
+            }
+         } else {
+            return QCBOR_ERR_UNEXPECTED_TYPE;
+         }
+         break;
 
-        case QCBOR_TYPE_UINT64:
-           if(uConvertTypes & QCBOR_CONVERT_TYPE_XINT64) {
-              *puValue =  pItem->val.uint64;
-           } else {
-              return QCBOR_ERR_UNEXPECTED_TYPE;
-           }
-           break;
+      case QCBOR_TYPE_UINT64:
+         if(uConvertTypes & QCBOR_CONVERT_TYPE_XINT64) {
+            *puValue =  pItem->val.uint64;
+         } else {
+            return QCBOR_ERR_UNEXPECTED_TYPE;
+         }
+         break;
 
-        default:
-           return QCBOR_ERR_UNEXPECTED_TYPE;
-     }
+      default:
+         return QCBOR_ERR_UNEXPECTED_TYPE;
+   }
+
    return QCBOR_SUCCESS;
 }
 
@@ -3981,8 +4012,6 @@
 }
 
 
-
-
 void QCBORDecode_GetUint64ConvertInternalInMapN(QCBORDecodeContext *pMe,
                                                int64_t             nLabel,
                                                uint32_t            uConvertTypes,
@@ -4016,6 +4045,7 @@
    pMe->uLastError = (uint8_t)ConvertUint64(pItem, uConvertTypes, puValue);
 }
 
+
 /*
  Public function, see header qcbor/qcbor_decode.h file
 */
@@ -4044,9 +4074,9 @@
       case QCBOR_TYPE_DECIMAL_FRACTION:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
             return ExponentitateNU(pItem->val.expAndMantissa.Mantissa.nInt,
-                                                       pItem->val.expAndMantissa.nExponent,
-                                                       puValue,
-                                                       Exponentitate10);
+                                   pItem->val.expAndMantissa.nExponent,
+                                   puValue,
+                                   Exponentitate10);
          } else {
             return QCBOR_ERR_UNEXPECTED_TYPE;
          }
@@ -4065,14 +4095,13 @@
 
       case QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
-            // TODO: Would be better to convert to unsigned
-            int64_t    nMantissa;
+            uint64_t   uMantissa;
             QCBORError uErr;
-            uErr = ConvertPositiveBigNumToSigned(pItem->val.expAndMantissa.Mantissa.bigNum, &nMantissa);
+            uErr = ConvertPositiveBigNumToUnsigned(pItem->val.expAndMantissa.Mantissa.bigNum, &uMantissa);
             if(uErr != QCBOR_SUCCESS) {
                return uErr;
             }
-            return ExponentitateNU(nMantissa,
+            return ExponentitateUU(uMantissa,
                                    pItem->val.expAndMantissa.nExponent,
                                    puValue,
                                    Exponentitate10);
@@ -4091,14 +4120,13 @@
 
       case QCBOR_TYPE_BIGFLOAT_POS_BIGNUM:
          if(uConvertTypes & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
-            // TODO: Would be better to convert to unsigned
-            int64_t    nMantissa;
+            uint64_t   uMantissa;
             QCBORError uErr;
-            uErr =  ConvertPositiveBigNumToSigned(pItem->val.expAndMantissa.Mantissa.bigNum, &nMantissa);
+            uErr =  ConvertPositiveBigNumToUnsigned(pItem->val.expAndMantissa.Mantissa.bigNum, &uMantissa);
             if(uErr != QCBOR_SUCCESS) {
                return uErr;
             }
-            return ExponentitateNU(nMantissa,
+            return ExponentitateUU(uMantissa,
                                    pItem->val.expAndMantissa.nExponent,
                                    puValue,
                                    Exponentitate2);
@@ -4120,6 +4148,7 @@
    }
 }
 
+
 /*
   Public function, see header qcbor/qcbor_decode.h file
 */
@@ -4249,7 +4278,6 @@
 }
 
 
-
 void QCBORDecode_GetDoubleConvertInternal(QCBORDecodeContext *pMe,
                                           uint32_t            uConvertTypes,
                                           double             *pdValue,
@@ -4289,6 +4317,7 @@
    pMe->uLastError = (uint8_t)ConvertDouble(pItem, uConvertTypes, pdValue);
 }
 
+
 void QCBORDecode_GetDoubleConvertInternalInMapSZ(QCBORDecodeContext *pMe,
                                                const char *          szLabel,
                                                uint32_t              uConvertTypes,
