警告:对于"long"类型,整数常量太大

liv*_*hak 0 c gcc gcc-warning

我有以下代码.

  uint32_t reg_val = 0;
  uint64_t val = 0;
  reg_val = 0;
  reg_val = ((val & 0xffffff000000) >> 24);
  dev_write(rw,reg_val);
Run Code Online (Sandbox Code Playgroud)

编译器发出警告说

warning: integer constant is too large for "long" type
Run Code Online (Sandbox Code Playgroud)

我只将24位分配给reg_val,它被定义为大小为32位的无符号整数.

为什么编译器会生成此警告?

gre*_*ggo 8

0xffffff000000对于32位长,常量太大,0x7fffffff在您的情况下范围.

把它写成0xFFFFFF000000ULL(unsigned long long)或通过写作避免问题

reg_val = (val >> 24) & 0xFFFFFF;
Run Code Online (Sandbox Code Playgroud)