Fix some -Wconversion warnings
diff --git a/build-all.sh b/build-all.sh
index ef03e30..6a1d3a5 100755
--- a/build-all.sh
+++ b/build-all.sh
@@ -50,15 +50,19 @@
 wuffs gen
 
 echo "Checking snapshot compiles cleanly (as C)"
-$CC  -c -Wall -Werror -Wpedantic                        -std=c99 \
+$CC -c \
+    -Wall -Werror -Wpedantic -Wconversion -std=c99 \
     release/c/wuffs-unsupported-snapshot.c -o /dev/null
-$CC  -c -Wall -Werror -Wpedantic -DWUFFS_IMPLEMENTATION -std=c99 \
+$CC -c -DWUFFS_IMPLEMENTATION \
+    -Wall -Werror -Wpedantic              -std=c99 \
     release/c/wuffs-unsupported-snapshot.c -o /dev/null
 
 echo "Checking snapshot compiles cleanly (as C++)"
-$CXX -c -Wall -Werror -Wpedantic                        -std=c++11 \
+$CXX -c \
+    -Wall -Werror -Wpedantic -Wconversion -std=c++11 \
     release/c/wuffs-unsupported-snapshot.c -o /dev/null
-$CXX -c -Wall -Werror -Wpedantic -DWUFFS_IMPLEMENTATION -std=c++11 \
+$CXX -c -DWUFFS_IMPLEMENTATION \
+    -Wall -Werror -Wpedantic              -std=c++11 \
     release/c/wuffs-unsupported-snapshot.c -o /dev/null
 
 wuffs genlib -skipgen
diff --git a/internal/cgen/base/core-public.h b/internal/cgen/base/core-public.h
index 311c2df..8c686c4 100644
--- a/internal/cgen/base/core-public.h
+++ b/internal/cgen/base/core-public.h
@@ -250,57 +250,57 @@
 
 static inline uint8_t  //
 wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
-  uint8_t res = x + y;
-  res |= -(res < x);
+  uint8_t res = (uint8_t)(x + y);
+  res |= (uint8_t)(-(res < x));
   return res;
 }
 
 static inline uint8_t  //
 wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
-  uint8_t res = x - y;
-  res &= -(res <= x);
+  uint8_t res = (uint8_t)(x - y);
+  res &= (uint8_t)(-(res <= x));
   return res;
 }
 
 static inline uint16_t  //
 wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
-  uint16_t res = x + y;
-  res |= -(res < x);
+  uint16_t res = (uint16_t)(x + y);
+  res |= (uint16_t)(-(res < x));
   return res;
 }
 
 static inline uint16_t  //
 wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
-  uint16_t res = x - y;
-  res &= -(res <= x);
+  uint16_t res = (uint16_t)(x - y);
+  res &= (uint16_t)(-(res <= x));
   return res;
 }
 
 static inline uint32_t  //
 wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
-  uint32_t res = x + y;
-  res |= -(res < x);
+  uint32_t res = (uint32_t)(x + y);
+  res |= (uint32_t)(-(res < x));
   return res;
 }
 
 static inline uint32_t  //
 wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
-  uint32_t res = x - y;
-  res &= -(res <= x);
+  uint32_t res = (uint32_t)(x - y);
+  res &= (uint32_t)(-(res <= x));
   return res;
 }
 
 static inline uint64_t  //
 wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
-  uint64_t res = x + y;
-  res |= -(res < x);
+  uint64_t res = (uint64_t)(x + y);
+  res |= (uint64_t)(-(res < x));
   return res;
 }
 
 static inline uint64_t  //
 wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
-  uint64_t res = x - y;
-  res &= -(res <= x);
+  uint64_t res = (uint64_t)(x - y);
+  res &= (uint64_t)(-(res <= x));
   return res;
 }
 
diff --git a/internal/cgen/data.go b/internal/cgen/data.go
index e81289e..e7d1a99 100644
--- a/internal/cgen/data.go
+++ b/internal/cgen/data.go
@@ -73,8 +73,8 @@
 	"" +
 	"// ---------------- Numeric Types\n\nstatic inline uint8_t  //\nwuffs_base__u8__min(uint8_t x, uint8_t y) {\n  return x < y ? x : y;\n}\n\nstatic inline uint8_t  //\nwuffs_base__u8__max(uint8_t x, uint8_t y) {\n  return x > y ? x : y;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__min(uint16_t x, uint16_t y) {\n  return x < y ? x : y;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__max(uint16_t x, uint16_t y) {\n  return x > y ? x : y;\n}\n\nstatic inline uint32_t  //\nwuffs_base__u32__min(uint32_t x, uint32_t y) {\n  return x < y ? x : y;\n}\n\nstatic inline uint32_t  //\nwuffs_base__u32__max(uint32_t x, uint32_t y) {\n  return x > y ? x : y;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__min(uint64_t x, uint64_t y) {\n  return x < y ? x : y;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__max(uint64_t x, uint64_t y) {\n  return x > y ? x : y;\n}\n\n" +
 	"" +
-	"// --------\n\n// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms\n// are per https://locklessinc.com/articles/sat_arithmetic/\n//\n// It is important that the underlying types are unsigned integers, as signed\n// integer arithmetic overflow is undefined behavior in C.\n\nstatic inline uint8_t  //\nwuffs_base__u8__sat_add(uint8_t x, uint8_t y) {\n  uint8_t res = x + y;\n  res |= -(res < x);\n  return res;\n}\n\nstatic inline uint8_t  //\nwuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {\n  uint8_t res = x - y;\n  res &= -(res <= x);\n  return res;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__sat_add(uint16_t x, uint16_t y) {\n  uint16_t res = x + y;\n  res |= -(res < x);\n  return res;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {\n  uint16_t res = x - y;\n  res &= -(res <= x);\n  return res;\n}\n\nstatic inline uint32_t  //\nwuffs_base__u32__sat_add(uint32_t x, uint32_t y) {\n  uint32_t res = x + y;\n  res |= -(res < x);\n  return res;\n}\n\nstatic inline uint32_t  //\nwuffs_base_" +
-	"_u32__sat_sub(uint32_t x, uint32_t y) {\n  uint32_t res = x - y;\n  res &= -(res <= x);\n  return res;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__sat_add(uint64_t x, uint64_t y) {\n  uint64_t res = x + y;\n  res |= -(res < x);\n  return res;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {\n  uint64_t res = x - y;\n  res &= -(res <= x);\n  return res;\n}\n\n" +
+	"// --------\n\n// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms\n// are per https://locklessinc.com/articles/sat_arithmetic/\n//\n// It is important that the underlying types are unsigned integers, as signed\n// integer arithmetic overflow is undefined behavior in C.\n\nstatic inline uint8_t  //\nwuffs_base__u8__sat_add(uint8_t x, uint8_t y) {\n  uint8_t res = (uint8_t)(x + y);\n  res |= (uint8_t)(-(res < x));\n  return res;\n}\n\nstatic inline uint8_t  //\nwuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {\n  uint8_t res = (uint8_t)(x - y);\n  res &= (uint8_t)(-(res <= x));\n  return res;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__sat_add(uint16_t x, uint16_t y) {\n  uint16_t res = (uint16_t)(x + y);\n  res |= (uint16_t)(-(res < x));\n  return res;\n}\n\nstatic inline uint16_t  //\nwuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {\n  uint16_t res = (uint16_t)(x - y);\n  res &= (uint16_t)(-(res <= x));\n  return res;\n}\n\nstatic inline uint32_t  //\nwuffs_base__u32__sat_add(uint32_t x, uint32_t y) {\n  uint32" +
+	"_t res = (uint32_t)(x + y);\n  res |= (uint32_t)(-(res < x));\n  return res;\n}\n\nstatic inline uint32_t  //\nwuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {\n  uint32_t res = (uint32_t)(x - y);\n  res &= (uint32_t)(-(res <= x));\n  return res;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__sat_add(uint64_t x, uint64_t y) {\n  uint64_t res = (uint64_t)(x + y);\n  res |= (uint64_t)(-(res < x));\n  return res;\n}\n\nstatic inline uint64_t  //\nwuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {\n  uint64_t res = (uint64_t)(x - y);\n  res &= (uint64_t)(-(res <= x));\n  return res;\n}\n\n" +
 	"" +
 	"// ---------------- Slices and Tables\n\n// WUFFS_BASE__SLICE is a 1-dimensional buffer.\n//\n// len measures a number of elements, not necessarily a size in bytes.\n//\n// A value with all fields NULL or zero is a valid, empty slice.\n#define WUFFS_BASE__SLICE(T) \\\n  struct {                   \\\n    T* ptr;                  \\\n    size_t len;              \\\n  }\n\n// WUFFS_BASE__TABLE is a 2-dimensional buffer.\n//\n// width height, and stride measure a number of elements, not necessarily a\n// size in bytes.\n//\n// A value with all fields NULL or zero is a valid, empty table.\n#define WUFFS_BASE__TABLE(T) \\\n  struct {                   \\\n    T* ptr;                  \\\n    size_t width;            \\\n    size_t height;           \\\n    size_t stride;           \\\n  }\n\ntypedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8;\ntypedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16;\ntypedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32;\ntypedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64;\n\ntypedef WUFFS_BASE__TABLE(u" +
 	"int8_t) wuffs_base__table_u8;\ntypedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16;\ntypedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32;\ntypedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64;\n\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__make_slice_u8(uint8_t* ptr, size_t len) {\n  wuffs_base__slice_u8 ret;\n  ret.ptr = ptr;\n  ret.len = len;\n  return ret;\n}\n\nstatic inline wuffs_base__slice_u16  //\nwuffs_base__make_slice_u16(uint16_t* ptr, size_t len) {\n  wuffs_base__slice_u16 ret;\n  ret.ptr = ptr;\n  ret.len = len;\n  return ret;\n}\n\nstatic inline wuffs_base__slice_u32  //\nwuffs_base__make_slice_u32(uint32_t* ptr, size_t len) {\n  wuffs_base__slice_u32 ret;\n  ret.ptr = ptr;\n  ret.len = len;\n  return ret;\n}\n\nstatic inline wuffs_base__slice_u64  //\nwuffs_base__make_slice_u64(uint64_t* ptr, size_t len) {\n  wuffs_base__slice_u64 ret;\n  ret.ptr = ptr;\n  ret.len = len;\n  return ret;\n}\n\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__null_slice_u8() {\n  wuffs_base__slice_u8 ret;\n  ret.ptr = NULL;\n " +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 8d39b6a..b7d381b 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -289,57 +289,57 @@
 
 static inline uint8_t  //
 wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
-  uint8_t res = x + y;
-  res |= -(res < x);
+  uint8_t res = (uint8_t)(x + y);
+  res |= (uint8_t)(-(res < x));
   return res;
 }
 
 static inline uint8_t  //
 wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
-  uint8_t res = x - y;
-  res &= -(res <= x);
+  uint8_t res = (uint8_t)(x - y);
+  res &= (uint8_t)(-(res <= x));
   return res;
 }
 
 static inline uint16_t  //
 wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
-  uint16_t res = x + y;
-  res |= -(res < x);
+  uint16_t res = (uint16_t)(x + y);
+  res |= (uint16_t)(-(res < x));
   return res;
 }
 
 static inline uint16_t  //
 wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
-  uint16_t res = x - y;
-  res &= -(res <= x);
+  uint16_t res = (uint16_t)(x - y);
+  res &= (uint16_t)(-(res <= x));
   return res;
 }
 
 static inline uint32_t  //
 wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
-  uint32_t res = x + y;
-  res |= -(res < x);
+  uint32_t res = (uint32_t)(x + y);
+  res |= (uint32_t)(-(res < x));
   return res;
 }
 
 static inline uint32_t  //
 wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
-  uint32_t res = x - y;
-  res &= -(res <= x);
+  uint32_t res = (uint32_t)(x - y);
+  res &= (uint32_t)(-(res <= x));
   return res;
 }
 
 static inline uint64_t  //
 wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
-  uint64_t res = x + y;
-  res |= -(res < x);
+  uint64_t res = (uint64_t)(x + y);
+  res |= (uint64_t)(-(res < x));
   return res;
 }
 
 static inline uint64_t  //
 wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
-  uint64_t res = x - y;
-  res &= -(res <= x);
+  uint64_t res = (uint64_t)(x - y);
+  res &= (uint64_t)(-(res <= x));
   return res;
 }