diff --git a/src/argparse.cpp b/src/argparse.cpp
index b66f85e..f399733 100644
--- a/src/argparse.cpp
+++ b/src/argparse.cpp
@@ -6,6 +6,7 @@ void print_help(const char *argv0)
     "\n"
     "\nUsage: %s [-ehknRtv] [-s START] [-l LEN] [-w WIDTH] <ntuple_file.root> [ntuple_name[;cycle]]"
     "\n\t-R: disable highlighting of non-RNTuple ROOT objects"
+    "\n\t-d: display addresses in decimal rather than hexadecimal"
     "\n\t-e: display some extended info(*) (may slow down the startup)"
     "\n\t-h: display this help and exit"
     "\n\t-l: display LEN bytes (only in terminal mode)"
@@ -66,6 +67,11 @@ void print_version_and_copyright()
   );
 }
 
+enum Print_Fmt {
+  PrintFmt_Hexadecimal,
+  PrintFmt_Decimal,
+};
+
 struct Cmdline_Args {
   b8 print_to_terminal;
   b8 show_help_and_exit;
@@ -76,6 +82,7 @@ struct Cmdline_Args {
   b8 extended_info;
   b8 only_print_rntuple_names;
   b8 print_keys_info;
+  Print_Fmt print_addr_fmt;
   b8 dont_collect_other_root_objs;
 
   String8 ntpl_name;
@@ -157,6 +164,8 @@ Cmdline_Args parse_args(i32 argc, char **argv)
       if (arg.size == 2) {
         if (arg[1] == 't')
           args.print_to_terminal = true;
+        else if (arg[1] == 'd')
+          args.print_addr_fmt = PrintFmt_Decimal;
         else if (arg[1] == 'e')
           args.extended_info = true;
         else if (arg[1] == 's')
diff --git a/src/rntviewer.cpp b/src/rntviewer.cpp
index bcf3b65..8e575b7 100644
--- a/src/rntviewer.cpp
+++ b/src/rntviewer.cpp
@@ -162,6 +162,8 @@ int main(int argc, char **argv)
   u32 walk_tkeys_flags = WTK_NONE;
   if (args.print_keys_info)
     walk_tkeys_flags |= WTK_PRINT_KEYS_INFO;
+  if (args.print_addr_fmt)
+    walk_tkeys_flags |= WTK_PRINT_DECIMAL;
   if (!args.dont_collect_other_root_objs)
     walk_tkeys_flags |= WTK_COLLECT_OTHER_ROOT_OBJS;
   app.walk_tkeys_flags = walk_tkeys_flags;
@@ -172,7 +174,10 @@ int main(int argc, char **argv)
   if (args.only_print_rntuple_names) {
     for (Section *sec = app.fdata.tfile_data.sections[Sec_RNTuple_Anchor].head; sec; sec = sec->next) {
       const RNTuple_Anchor_Info *info = (const RNTuple_Anchor_Info *)sec->info;
-      printf("%s at 0x%" PRIX64 "\n", info->name.c(), info->offset_in_file);
+      if (args.print_addr_fmt == PrintFmt_Decimal)
+        printf("%s at %" PRIu64 "\n", info->name.c(), info->offset_in_file);
+      else
+        printf("%s at 0x%" PRIX64 "\n", info->name.c(), info->offset_in_file);
     }
     return 0;
   }
diff --git a/src/tfile.cpp b/src/tfile.cpp
index 3af6e4d..90bb39e 100644
--- a/src/tfile.cpp
+++ b/src/tfile.cpp
@@ -74,6 +74,7 @@ enum {
   WTK_NONE = 0,
   WTK_PRINT_KEYS_INFO = 1,
   WTK_COLLECT_OTHER_ROOT_OBJS = 2,
+  WTK_PRINT_DECIMAL = 4,
 };
 
 // Examines the innards of a TFile to get byte range info about the TKeys.
@@ -214,13 +215,19 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
     n_bytes = abs(n_bytes); 
 
     if (!n_bytes) {
-      fprintf(stderr, "Error: found key or obj with len 0 at 0x%" PRIX64 ". Bailing out...\n", cur);
+      if (flags & WTK_PRINT_DECIMAL)
+        fprintf(stderr, "Error: found key with size 0 at %" PRIu64 ". Bailing out...\n", cur);
+      else
+        fprintf(stderr, "Error: found key with size 0 at 0x%" PRIX64 ". Bailing out...\n", cur);
       break;
     }
  
     if (is_free_slot) {
       if (flags & WTK_PRINT_KEYS_INFO) {
-        printf("Free Slot at 0x%lX, len: %d (%s)\n", cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
+        if (flags & WTK_PRINT_DECIMAL)
+          printf("Free Slot at %" PRIu64 ", len: %d (%s)\n", cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
+        else
+          printf("Free Slot at 0x%" PRIX64 ", len: %d (%s)\n", cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
       }
       // don't try to read the rest of the data
       cur += n_bytes;
@@ -230,8 +237,11 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
     u16 key_version = read_be<u16>(data + cur + key_version_off);
     u32 objlen = read_be<u32>(data + cur + objlen_off);
     u16 keylen = read_be<u16>(data + cur + keylen_off);
-    if (!keylen) {
-      fprintf(stderr, "Error: found key or obj with len 0 at 0x%" PRIX64 ". Bailing out...\n", cur);
+    if (!keylen || !objlen) {
+      if (flags & WTK_PRINT_DECIMAL)
+        fprintf(stderr, "Error: found key or obj with keylen 0 at %" PRIu64 ". Bailing out...\n", cur);
+      else
+        fprintf(stderr, "Error: found key or obj with keylen 0 at 0x%" PRIX64 ". Bailing out...\n", cur);
       break;
     }
 
@@ -242,7 +252,10 @@ b8 walk_tkeys(Arena *arena, const u8 *data, u64 data_len, u32 flags, TFile_Data
       char cname[256];
       cname[cname_len] = 0;
       memcpy(cname, data + cname_off + 1, cname_len);
-      printf("TKey '%s' at 0x%lX, len: %d (%s)\n", cname, cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
+      if (flags & WTK_PRINT_DECIMAL)
+        printf("TKey '%s' at %" PRIu64 ", len: %d (%s)\n", cname, cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
+      else
+        printf("TKey '%s' at 0x%" PRIX64 ", len: %d (%s)\n", cname, cur, n_bytes, to_pretty_size(scratch.arena, n_bytes).c());
       ++n_keys;
     }