diff --git a/src/encode.c b/src/encode.c
index db08e24cf6bc88691c3de68071e1fed37a276afb..c5b4594b0da6e69215764f54a1bf2fd1382a91fa 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -2261,7 +2261,8 @@ static DECLSPEC(noreturn) void decode_error (
      num=e;						\
   } else {						\
     num = 0;						\
-    while(e-->=0) num = (num<<8) + (GETC()+1);		\
+    while(e-->=0) num = ((unsigned INT64)num<<8)	\
+			    + (GETC()+1);		\
     num += MAX_SMALL - 1;				\
   }							\
   if(what & TAG_NEG) {					\
@@ -2367,7 +2368,7 @@ static DECLSPEC(noreturn) void decode_error (
    INT32 what, e;				\
    INT64 num;					\
    DECODE("decode_number");			\
-   X=(what & TAG_MASK) | ((INT32) num<<4);	\
+   X=(what & TAG_MASK) | ((unsigned INT64)num<<4);		\
    EDB(5, fprintf(stderr, "%*s  ==>%ld\n",	\
 		  data->depth, "", (long) X));	\
   }while(0)					\
diff --git a/src/lexer.h b/src/lexer.h
index b3c08481a0cdefdced85da7011e3c38b015ce795..70df5a46b1cfef58c5904d236f901e0239efa8e0 100644
--- a/src/lexer.h
+++ b/src/lexer.h
@@ -292,6 +292,7 @@ int parse_esc_seq (WCHAR *buf, p_wchar2 *chr, ptrdiff_t *len)
     case 'U': {
       /* FIXME: Do we need compat goo to turn this off? */
       /* Note: Code dup in gobble_identifier in preprocessor.h. */
+      unsigned INT32 n = 0;
       int stop, longq;
       l = 1;
       if (buf[1] == c) {
@@ -312,23 +313,23 @@ int parse_esc_seq (WCHAR *buf, p_wchar2 *chr, ptrdiff_t *len)
 	stop = l + 8;
 	longq = 1;
       }
-      c = 0;
       for (; l < stop; l++)
 	switch (buf[l]) {
 	  case '0': case '1': case '2': case '3': case '4':
 	  case '5': case '6': case '7': case '8': case '9':
-	    c = 16 * c + buf[l] - '0';
+	    n = 16 * n + buf[l] - '0';
 	    break;
 	  case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-	    c = 16 * c + buf[l] - 'a' + 10;
+	    n = 16 * n + buf[l] - 'a' + 10;
 	    break;
 	  case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-	    c = 16 * c + buf[l] - 'A' + 10;
+	    n = 16 * n + buf[l] - 'A' + 10;
 	    break;
 	  default:
 	    *len = l;
 	    return longq ? 8 : 7;
 	}
+      c = (p_wchar2)n;
     }
   }
 
diff --git a/src/modules/Gmp/mpz_glue.c b/src/modules/Gmp/mpz_glue.c
index 078d549e5e837fe296cd64a37fbffb7f638b772d..2b26fb7f3e085a22f1f3dbc8dcd17ff182edf3e3 100644
--- a/src/modules/Gmp/mpz_glue.c
+++ b/src/modules/Gmp/mpz_glue.c
@@ -658,15 +658,15 @@ static INT32 crc_table[256];
 
 static void init_crc_table(void)
 {
-  int i;
+  unsigned INT32 i;
   for (i = 0; i < 256; i++) {
     int j;
     INT32 crc = i << 24;
     for (j = 0; j < 8; j++) {
       if (crc < 0) {
-	crc = (crc << 1)^0x04c11db7L;
+	crc = (((unsigned INT32)crc) << 1)^0x04c11db7L;
       } else {
-	crc <<= 1;
+	crc = ((unsigned INT32)crc) << 1;
       }
     }
     crc_table[i] = crc;
diff --git a/src/modules/Image/encodings/avs.c b/src/modules/Image/encodings/avs.c
index ec89bc66cc9d5595955e3ec31c4ed7d1ea6aa11c..788db13854a31b961d7d5cded42c43ac391bdfc4 100644
--- a/src/modules/Image/encodings/avs.c
+++ b/src/modules/Image/encodings/avs.c
@@ -137,7 +137,7 @@ void image_avs_f_encode(INT32 args )
   for(y=0; y<i->ysize; y++)
     for(x=0; x<i->xsize; x++)
     {
-      register int rv = 0;
+      register unsigned int rv = 0;
       rgb_group pix = *(is++);
       if(as) apix = *(as++);
       rv = ((apix.g<<24)|(pix.r<<16)|(pix.g<<8)|pix.b);
diff --git a/src/modules/Image/encodings/x.c b/src/modules/Image/encodings/x.c
index 5f2971b975aa6bc4a360109f89a5cb81d2a4eeec..c29774bab12fd4692056d9b05cf06d298a9f6ea6 100644
--- a/src/modules/Image/encodings/x.c
+++ b/src/modules/Image/encodings/x.c
@@ -605,7 +605,7 @@ static void image_x_encode_pseudocolor_1byte(INT32 args,
 	 x=img->xsize; 
 	 while (x--) 
 	 {
-	    b = ((*(s++))<<(32-bpp)) & 0xffffffff;
+	    b = (((unsigned long)*(s++))<<(32-bpp)) & 0xffffffff;
 	    bp = bpp;
 	    while (bp>8-bit)
 	    {
diff --git a/src/post_modules/CritBit/inttree.cmod b/src/post_modules/CritBit/inttree.cmod
index c9b004e49239084fdaa3be0e8a670e335b769d9b..f42fa97724bb71a8e50ff2e33eb3024ab988b984 100644
--- a/src/post_modules/CritBit/inttree.cmod
+++ b/src/post_modules/CritBit/inttree.cmod
@@ -78,8 +78,9 @@ struct pike_string * cb_ptype_from_key_ipv4(cb_key key) {
 
     unsigned INT32 ip = (unsigned INT32)key.str;
 
-    if (key.len.bits || !key.len.chars) {
-	ip &= (~0U) << (32 - (int)(key.len.bits - WASTED_BITS));
+    if (key.len.bits && !key.len.chars) {
+	if (key.len.bits > WASTED_BITS)
+	    ip &= (~0U) << (32 - (int)(key.len.bits - WASTED_BITS));
 	len = snprintf(buf, 19, "%u.%u.%u.%u/%u",
 		       (unsigned int)(ip>>24), (unsigned int)((ip>>16)&0xff),
 		       (unsigned int)((ip>>8)&0xff), (unsigned int)(ip&0xff),
diff --git a/src/program.c b/src/program.c
index 61603ae136556d131436239c491646e3ba8b416f..0b87ccab004ba065093b726ce84125b9b65a5594 100644
--- a/src/program.c
+++ b/src/program.c
@@ -11340,7 +11340,7 @@ PMOD_EXPORT ptrdiff_t low_get_storage(struct program *o, struct program *p)
   if(!o) return -1;
   oid=o->id;
   pid=p->id;
-  hval=oid*9248339 + pid;
+  hval=(unsigned)oid*9248339 + (unsigned)pid;
   hval%=GET_STORAGE_CACHE_SIZE;
 #ifdef PIKE_DEBUG
   if(hval>GET_STORAGE_CACHE_SIZE)
@@ -11563,7 +11563,7 @@ PMOD_EXPORT int implements(struct program *a, struct program *b)
   if(!a || !b) return -1;
   if(a==b) return 1;
 
-  hval = a->id*9248339 + b->id;
+  hval = (unsigned)a->id*9248339 + (unsigned)b->id;
   hval %= IMPLEMENTS_CACHE_SIZE;
 #ifdef PIKE_DEBUG
   if(hval >= IMPLEMENTS_CACHE_SIZE)
@@ -11648,7 +11648,7 @@ PMOD_EXPORT int is_compatible(struct program *a, struct program *b)
     bid = tmp;
   }
 
-  hval = aid*9248339 + bid;
+  hval = (unsigned long)aid*9248339 + (unsigned long)bid;
   hval %= IMPLEMENTS_CACHE_SIZE;
 #ifdef PIKE_DEBUG
   if(hval >= IMPLEMENTS_CACHE_SIZE)
@@ -11666,7 +11666,7 @@ PMOD_EXPORT int is_compatible(struct program *a, struct program *b)
     /* a implements b */
     return 1;
   }
-  rhval = bid*9248339 + aid;
+  rhval = (unsigned long)bid*9248339 + (unsigned long)aid;
   rhval %= IMPLEMENTS_CACHE_SIZE;
 #ifdef PIKE_DEBUG
   if(rhval >= IMPLEMENTS_CACHE_SIZE)
diff --git a/src/stralloc.c b/src/stralloc.c
index 951aa7673855aa69399ee02e03fa7c4d288cafdf..9b9766085bd77c0e23ba5e1016c813d518903474 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -2964,7 +2964,7 @@ PMOD_EXPORT void string_builder_append_integer(struct string_builder *s,
     else shift = delta;
 
     /* Calculate actual number of digits and initial shift. */
-    for (; tmp >> shift && shift < SIZEOF_LONGEST * 8; shift += delta, len++)
+    for (; shift < SIZEOF_LONGEST * 8 && tmp >> shift; shift += delta, len++)
       ;
 
     if ((len < min_width) && !(flags & APPEND_LEFT)) {