Fixed upb encoder for field numbers > 2**28.

The encoder was improperly sign-extending the tag to 64 bits.
diff --git a/tests/bindings/lua/test.proto b/tests/bindings/lua/test.proto
index 2803835..6b45350 100644
--- a/tests/bindings/lua/test.proto
+++ b/tests/bindings/lua/test.proto
@@ -22,3 +22,7 @@
   repeated fixed32 f32_packed = 4 [packed = false];
   repeated fixed64 f64_packed = 5 [packed = false];
 }
+
+message TestLargeFieldNumber {
+  optional int32 i32 = 456214797;
+}
diff --git a/tests/bindings/lua/test_upb.lua b/tests/bindings/lua/test_upb.lua
index df99d2e..e2d5345 100644
--- a/tests/bindings/lua/test_upb.lua
+++ b/tests/bindings/lua/test_upb.lua
@@ -706,6 +706,14 @@
   assert_error(function() upb.encode(msg) end)
 end
 
+function test_large_field_number()
+  local msg = upb_test.TestLargeFieldNumber()
+  msg.i32 = 5
+  local serialized = upb.encode(msg)
+  local msg2 = upb.decode(upb_test.TestLargeFieldNumber, serialized)
+  assert_equal(msg.i32, msg2.i32)
+end
+
 function test_gc()
   local top = test_messages_proto3.TestAllTypesProto3()
   local n = 100