c/c++语言开发共享格式说明符如何在内部工作?

考虑:

int x=0xdeadbeef; char c=x; printf("%x",c); 

输出是ffffffef 。 怎么样? 为什么不是000000ef

    32位整数不适合8位字符,因此char c=x;c=0xef相同。

    然后显然char在您的编译器上签名并且0xef大于127,因此它被转换为某个负值-17。

    传递给printf ,负值char被提升为int ,符号被保留(这称为“默认参数提升”,并由所有可变参数函数使用)。 32位二进制补码表示-17是ffffffef 。 使用%x您使用错误的格式说明符; printf期望unsigned int 。 它会尝试将带符号的数字显示为无符号。

    你可以通过用uint8_t替换char来修复bug。

    总的来说,这段代码非常值得怀疑,因为它依赖于许多指定不当的行为。 您不应该溢出有符号整数,不应该使用char来存储值,您应该努力使用正确的格式说明符。

    这不是“如何格式化说明符工作”的问题,而是“ char工作原理”的问题。

    没有任何其他类型信息的char可以是有符号值或无符号值,哪一个是编译器相关的。 如果需要特定的签名,则应使用unsigned charsigned char

    %x格式指令需要unsigned int,因此(基本上)将char首先转换为int,然后将其解释为unsigned int。 如果您的char已签名,它将在转换为int时进行符号扩展,这就是您获得所看到的值的原因。

      以上就是c/c++开发分享格式说明符如何在内部工作?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/519219.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐