remove undefined behavior
diff --git a/skeletons/INTEGER.c b/skeletons/INTEGER.c
index 66a96f4..798fb28 100644
--- a/skeletons/INTEGER.c
+++ b/skeletons/INTEGER.c
@@ -633,13 +633,14 @@
 				if(asn_ulong2INTEGER(st, uvalue))
 					ASN__DECODE_FAILED;
 			} else {
-				unsigned long svalue = 0;
+				unsigned long uvalue = 0;
+				long svalue;
 				if(uper_get_constrained_whole_number(pd,
-					&svalue, ct->range_bits))
+					&uvalue, ct->range_bits))
 					ASN__DECODE_STARVED;
-				ASN_DEBUG("Got value %ld + low %ld",
-					svalue, ct->lower_bound);
-				svalue += ct->lower_bound;
+				ASN_DEBUG("Got value %lu + low %ld",
+					uvalue, ct->lower_bound);
+				svalue = ct->lower_bound + (long)uvalue;
 				if(asn_long2INTEGER(st, svalue))
 					ASN__DECODE_FAILED;
 			}
diff --git a/skeletons/asn_bit_data.c b/skeletons/asn_bit_data.c
index 2852c2d..378496d 100644
--- a/skeletons/asn_bit_data.c
+++ b/skeletons/asn_bit_data.c
@@ -86,7 +86,7 @@
 	else if(off <= 24)
 		accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off);
 	else if(off <= 31)
-		accum = ((buf[0] << 24) + (buf[1] << 16)
+		accum = (((uint32_t)buf[0] << 24) + (buf[1] << 16)
 			+ (buf[2] << 8) + (buf[3])) >> (32 - off);
 	else if(nbits <= 31) {
 		asn_bit_data_t tpd = *pd;