diff --git a/src/port.c b/src/port.c
index f7b7414159b8a7159538fac543b2b19ef531968e..4ec365daa662e301b2d3765d313110f92e370a4d 100644
--- a/src/port.c
+++ b/src/port.c
@@ -577,16 +577,27 @@ int VFPRINTF(FILE *f,char *s,va_list args)
 #if defined(DEBUG) && !defined(HANDLES_UNALIGNED_MEMORY_ACCESS)
 unsigned INT16 EXTRACT_UWORD(unsigned char *p)
 {
-  return (EXTRACT_UCHAR(p)<<8) + EXTRACT_UCHAR(p+1);
+  unsigned INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  return a;
 }
 
 INT16 EXTRACT_WORD(unsigned char *p)
 {
-  return (EXTRACT_CHAR(p)<<8) | EXTRACT_UCHAR(p+1);
+  INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  return a;
 }
 
 INT32 EXTRACT_INT(unsigned char *p)
 {
-  return (EXTRACT_WORD(p)<<16) | EXTRACT_UWORD(p+2);
+  INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  ((unsigned char *)&a)[2]=p[2];
+  ((unsigned char *)&a)[3]=p[3];
+  return a;
 }
 #endif
diff --git a/src/port.h b/src/port.h
index d956ae9a1d93539c289b87a14f436ad88d2a300c..f00de8a1794e4cbd83c016ffa6e465a7fda6c4ec 100644
--- a/src/port.h
+++ b/src/port.h
@@ -142,17 +142,28 @@ INT32 EXTRACT_INT(unsigned char *p);
 #else
 static INLINE unsigned INT16 EXTRACT_UWORD(unsigned char *p)
 {
-  return (EXTRACT_UCHAR(p)<<8) + EXTRACT_UCHAR(p+1);
+  unsigned INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  return a;
 }
 
 static INLINE INT16 EXTRACT_WORD(unsigned char *p)
 {
-  return (EXTRACT_CHAR(p)<<8) | EXTRACT_UCHAR(p+1);
+  INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  return a;
 }
 
 static INLINE INT32 EXTRACT_INT(unsigned char *p)
 {
-  return (EXTRACT_WORD(p)<<16) | EXTRACT_UWORD(p+2);
+  INT16 a;
+  ((unsigned char *)&a)[0]=p[0];
+  ((unsigned char *)&a)[1]=p[1];
+  ((unsigned char *)&a)[2]=p[2];
+  ((unsigned char *)&a)[3]=p[3];
+  return a;
 }
 #endif
 #endif