gpt4 book ai didi

c - 标准 C 预处理器如何解释 "0xFFFFFFFF"?

转载 作者:太空狗 更新时间:2023-10-29 15:24:20 25 4
gpt4 key购买 nike

标准 C 预处理器如何解释“0xFFFFFFFF”:4G-1 或 -1?

“~0”的相同问题...

如果答案是 -1,那么如何让它解释为 4G-1(即,除了显式使用 4294967295 之外还有其他方法吗)?

P.S.:我在 MS Visual Studio 上试过(当然是使用比较而不是调用 'printf',因为后者只会根据指定的 '%' 打印),答案是 4G-1。但我不确定 MS Visual Studio 使用标准的 C 预处理器。

谢谢

最佳答案

就预处理器而言,0xFFFFFFFF 只是一个十六进制常量。预处理器表达式中的数字(仅在 #if#elif 指令中相关)被认为是最广泛的可用整数类型;预处理器会将 0xFFFFFFFF 视为值为 232-1 或 4294967295 的有符号整数常量(因为从 C99 开始,有始终是至少 64 位的整数类型)。

如果它出现在 #if#elif 指令以外的任何地方,那么预处理器是无关紧要的。十六进制常量的类型是第一个:

  • int
  • 无符号整数
  • 长整数
  • unsigned long int
  • long long int
  • unsigned long long int

对于这个特定的常数,有几种可能性:

  • 如果int小于32位且long大于32位,则类型为long
  • 如果int小于32位且long恰好是32位,则类型为unsigned long
  • 如果int为32位,则类型为unsigned int
  • 如果 int 大于 32 位,则类型为 int

在现代系统中,unsigned intunsigned long 是最有可能的。

所有情况下,0xFFFFFFFF 的值恰好为 232-1,即 4294967295;它从不有负值。

但是,通过转换(显式或隐式)0xFFFFFFFF 签名类型:

int n = 0xFFFFFFFF;

但这不是可移植的。如果 int 大于 32 位,则存储的值将为 232-1。即使 int 恰好是 32 位,将无符号值转换为有符号类型的结果也是实现定义的; -1 是一个常见的结果,但不能保证。

至于 ~0,这是一个 int 表达式,其值的所有位都设置为 1 -- 通常 -1,但这并不能保证。

你到底想做什么?

关于c - 标准 C 预处理器如何解释 "0xFFFFFFFF"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com