diff --git a/py/binary.c b/py/binary.c
index 3f1d7f286729f3a8ceaabf9e46f1fca764546126..65688272aab4b9548fe304c5d00260742efe769a 100644
--- a/py/binary.c
+++ b/py/binary.c
@@ -26,6 +26,7 @@
 
 #include <stdint.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <string.h>
 #include <assert.h>
 
@@ -37,6 +38,10 @@
 
 // Helpers to work with binary-encoded data
 
+#ifndef alignof
+#define alignof(type) offsetof(struct { char c; type t; }, t)
+#endif
+
 int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
     int size = 0;
     int align = 1;
@@ -68,16 +73,20 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
                 case 'b': case 'B':
                     align = size = 1; break;
                 case 'h': case 'H':
-                    align = size = sizeof(short); break;
+                    align = alignof(short);
+                    size = sizeof(short); break;
                 case 'i': case 'I':
-                    align = size = sizeof(int); break;
+                    align = alignof(int);
+                    size = sizeof(int); break;
                 case 'l': case 'L':
-                    align = size = sizeof(long); break;
+                    align = alignof(long);
+                    size = sizeof(long); break;
                 case 'q': case 'Q':
-                    // TODO: This is for x86
-                    align = sizeof(int); size = sizeof(long long); break;
+                    align = alignof(long long);
+                    size = sizeof(long long); break;
                 case 'P': case 'O': case 'S':
-                    align = size = sizeof(void*); break;
+                    align = alignof(void*);
+                    size = sizeof(void*); break;
             }
         }
     }