diff --git a/sensordatahandler.hpp b/sensordatahandler.hpp
index 89d00d0..601f5cd 100644
--- a/sensordatahandler.hpp
+++ b/sensordatahandler.hpp
@@ -258,26 +258,20 @@
     constexpr uint8_t sensorUnitsSignedBits = 2 << 6;
     constexpr uint8_t signedDataFormat = 0x80;
     // if sensorUnits1 [7:6] = 10b, sensor is signed
+    int32_t minClamp;
+    int32_t maxClamp;
     if ((sensorInfo.sensorUnits1 & sensorUnitsSignedBits) == signedDataFormat)
     {
-        if (rawData > std::numeric_limits<int8_t>::max() ||
-            rawData < std::numeric_limits<int8_t>::lowest())
-        {
-            log<level::ERR>("Value out of range");
-            throw std::out_of_range("Value out of range");
-        }
-        setReading(static_cast<int8_t>(rawData), &response);
+        minClamp = std::numeric_limits<int8_t>::lowest();
+        maxClamp = std::numeric_limits<int8_t>::max();
     }
     else
     {
-        if (rawData > std::numeric_limits<uint8_t>::max() ||
-            rawData < std::numeric_limits<uint8_t>::lowest())
-        {
-            log<level::ERR>("Value out of range");
-            throw std::out_of_range("Value out of range");
-        }
-        setReading(static_cast<uint8_t>(rawData), &response);
+        minClamp = std::numeric_limits<uint8_t>::lowest();
+        maxClamp = std::numeric_limits<uint8_t>::max();
     }
+    setReading(static_cast<uint8_t>(std::clamp(rawData, minClamp, maxClamp)),
+               &response);
 
     if (!std::isfinite(value))
     {
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index 30cee8b..e04319c 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -690,6 +690,21 @@
     ipmi::PropertyMap warnThresholds;
     ec = ipmi::getAllDbusProperties(ctx, service, info.sensorPath,
                                     warningThreshIntf, warnThresholds);
+    int32_t minClamp;
+    int32_t maxClamp;
+    int32_t rawData;
+    constexpr uint8_t sensorUnitsSignedBits = 2 << 6;
+    constexpr uint8_t signedDataFormat = 0x80;
+    if ((info.sensorUnits1 & sensorUnitsSignedBits) == signedDataFormat)
+    {
+        minClamp = std::numeric_limits<int8_t>::lowest();
+        maxClamp = std::numeric_limits<int8_t>::max();
+    }
+    else
+    {
+        minClamp = std::numeric_limits<uint8_t>::lowest();
+        maxClamp = std::numeric_limits<uint8_t>::max();
+    }
     if (!ec)
     {
         double warnLow = ipmi::mappedVariant<double>(
@@ -702,8 +717,9 @@
         if (std::isfinite(warnLow))
         {
             warnLow *= std::pow(10, info.scale - info.exponentR);
-            resp.lowerNonCritical = static_cast<uint8_t>(
-                round((warnLow - info.scaledOffset) / info.coefficientM));
+            rawData = round((warnLow - info.scaledOffset) / info.coefficientM);
+            resp.lowerNonCritical =
+                static_cast<uint8_t>(std::clamp(rawData, minClamp, maxClamp));
             resp.validMask |= static_cast<uint8_t>(
                 ipmi::sensor::ThresholdMask::NON_CRITICAL_LOW_MASK);
         }
@@ -711,8 +727,9 @@
         if (std::isfinite(warnHigh))
         {
             warnHigh *= std::pow(10, info.scale - info.exponentR);
-            resp.upperNonCritical = static_cast<uint8_t>(
-                round((warnHigh - info.scaledOffset) / info.coefficientM));
+            rawData = round((warnHigh - info.scaledOffset) / info.coefficientM);
+            resp.upperNonCritical =
+                static_cast<uint8_t>(std::clamp(rawData, minClamp, maxClamp));
             resp.validMask |= static_cast<uint8_t>(
                 ipmi::sensor::ThresholdMask::NON_CRITICAL_HIGH_MASK);
         }
@@ -733,8 +750,9 @@
         if (std::isfinite(critLow))
         {
             critLow *= std::pow(10, info.scale - info.exponentR);
-            resp.lowerCritical = static_cast<uint8_t>(
-                round((critLow - info.scaledOffset) / info.coefficientM));
+            rawData = round((critLow - info.scaledOffset) / info.coefficientM);
+            resp.lowerCritical =
+                static_cast<uint8_t>(std::clamp(rawData, minClamp, maxClamp));
             resp.validMask |= static_cast<uint8_t>(
                 ipmi::sensor::ThresholdMask::CRITICAL_LOW_MASK);
         }
@@ -742,8 +760,9 @@
         if (std::isfinite(critHigh))
         {
             critHigh *= std::pow(10, info.scale - info.exponentR);
-            resp.upperCritical = static_cast<uint8_t>(
-                round((critHigh - info.scaledOffset) / info.coefficientM));
+            rawData = round((critHigh - info.scaledOffset) / info.coefficientM);
+            resp.upperCritical =
+                static_cast<uint8_t>(std::clamp(rawData, minClamp, maxClamp));
             resp.validMask |= static_cast<uint8_t>(
                 ipmi::sensor::ThresholdMask::CRITICAL_HIGH_MASK);
         }
