diff --git a/pd/src/d_soundfile.c b/pd/src/d_soundfile.c
index 891c191a9a6430fccf0a97de69026f7a8ef4d2f7..03bb88fea871f6bbae3eda314e82a5d7b365d363 100644
--- a/pd/src/d_soundfile.c
+++ b/pd/src/d_soundfile.c
@@ -49,6 +49,12 @@ objects use Posix-like threads.  */
 typedef unsigned short uint16;
 typedef unsigned int uint32;
 
+typedef union
+{
+    float f;
+    uint32_t ui;
+}t_aliasfloatuint;
+
 #define FORMAT_WAVE 0
 #define FORMAT_AIFF 1
 #define FORMAT_NEXT 2
@@ -463,6 +469,7 @@ static void soundfile_xferin_sample(int sfchannels, int nvecs, t_sample **vecs,
     int i, j;
     unsigned char *sp, *sp2;
     t_sample *fp;
+    t_aliasfloatuint alias;
     int nchannels = (sfchannels < nvecs ? sfchannels : nvecs);
     int bytesperframe = bytespersamp * sfchannels;
     for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
@@ -504,16 +511,22 @@ static void soundfile_xferin_sample(int sfchannels, int nvecs, t_sample **vecs,
             if (bigendian)
             {
                 for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
-                    j < nitems; j++, sp2 += bytesperframe, fp += spread)
-                        *(long *)fp = ((sp2[0] << 24) | (sp2[1] << 16)
+                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
+                    {
+                        alias.ui = ((sp2[0] << 24) | (sp2[1] << 16)
                             | (sp2[2] << 8) | sp2[3]);
+                        *fp = (t_float)alias.f;
+                    }
             }
             else
             {
                 for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
-                    j < nitems; j++, sp2 += bytesperframe, fp += spread)
-                        *(long *)fp = ((sp2[3] << 24) | (sp2[2] << 16)
+                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
+                    {
+                        alias.ui = ((sp2[3] << 24) | (sp2[2] << 16)
                             | (sp2[1] << 8) | sp2[0]);
+                        *fp = (t_float)alias.f;
+                    }
             }
         }
     }
@@ -531,6 +544,7 @@ static void soundfile_xferin_float(int sfchannels, int nvecs, t_float **vecs,
     int i, j;
     unsigned char *sp, *sp2;
     t_float *fp;
+    t_aliasfloatuint alias;
     int nchannels = (sfchannels < nvecs ? sfchannels : nvecs);
     int bytesperframe = bytespersamp * sfchannels;
     for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
@@ -572,16 +586,22 @@ static void soundfile_xferin_float(int sfchannels, int nvecs, t_float **vecs,
             if (bigendian)
             {
                 for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
-                    j < nitems; j++, sp2 += bytesperframe, fp += spread)
-                        *(long *)fp = ((sp2[0] << 24) | (sp2[1] << 16)
+                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
+                    {
+                        alias.ui = ((sp2[0] << 24) | (sp2[1] << 16)
                             | (sp2[2] << 8) | sp2[3]);
+                        *fp = (t_float)alias.f;
+                    }
             }
             else
             {
                 for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
-                    j < nitems; j++, sp2 += bytesperframe, fp += spread)
-                        *(long *)fp = ((sp2[3] << 24) | (sp2[2] << 16)
+                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
+                    {
+                        alias.ui = ((sp2[3] << 24) | (sp2[2] << 16)
                             | (sp2[1] << 8) | sp2[0]);
+                        *fp = (t_float)alias.f;
+                    }
             }
         }
     }
@@ -932,6 +952,7 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
     int i, j;
     unsigned char *sp, *sp2;
     t_sample *fp;
+    t_aliasfloatuint alias;
     int bytesperframe = bytespersamp * nchannels;
     long xx;
     for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
@@ -1013,8 +1034,8 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
                 for (j = 0, sp2 = sp, fp=vecs[i] + onset;
                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
                 {
-                    t_sample f2 = *fp * normalfactor;
-                    xx = *(long *)&f2;
+                    alias.f = (float)(*fp * normalfactor);
+                    xx = alias.ui;
                     sp2[0] = (xx >> 24); sp2[1] = (xx >> 16);
                     sp2[2] = (xx >> 8); sp2[3] = xx;
                 }
@@ -1024,8 +1045,8 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
                 for (j = 0, sp2 = sp, fp=vecs[i] + onset;
                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
                 {
-                    t_sample f2 = *fp * normalfactor;
-                    xx = *(long *)&f2;
+                    alias.f = (float)(*fp * normalfactor);
+                    xx = alias.ui;
                     sp2[3] = (xx >> 24); sp2[2] = (xx >> 16);
                     sp2[1] = (xx >> 8); sp2[0] = xx;
                 }
@@ -1040,6 +1061,7 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
     int i, j;
     unsigned char *sp, *sp2;
     t_float *fp;
+    t_aliasfloatuint alias;
     int bytesperframe = bytespersamp * nchannels;
     long xx;
     for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
@@ -1121,8 +1143,8 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
                 for (j = 0, sp2 = sp, fp=vecs[i] + onset;
                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
                 {
-                    t_sample f2 = *fp * normalfactor;
-                    xx = *(long *)&f2;
+                    alias.f = (float)(*fp * normalfactor);
+                    xx = alias.ui;
                     sp2[0] = (xx >> 24); sp2[1] = (xx >> 16);
                     sp2[2] = (xx >> 8); sp2[3] = xx;
                 }
@@ -1132,8 +1154,8 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
                 for (j = 0, sp2 = sp, fp=vecs[i] + onset;
                     j < nitems; j++, sp2 += bytesperframe, fp += spread)
                 {
-                    t_sample f2 = *fp * normalfactor;
-                    xx = *(long *)&f2;
+                    alias.f = (float)(*fp * normalfactor);
+                    xx = alias.ui;
                     sp2[3] = (xx >> 24); sp2[2] = (xx >> 16);
                     sp2[1] = (xx >> 8); sp2[0] = xx;
                 }