【问题标题】:Variable affected by type conversion受类型转换影响的变量
【发布时间】:2017-05-23 21:59:09
【问题描述】:

我一直认为,当一个变量被类型转换时,它会产生一个副本,并且任何更改都会影响该临时变量。但是,下面的屏幕截图表明并非如此。显然,原始变量是什么变化。为什么?我很好奇,因为我从未见过类似的东西。

【问题讨论】:

  • 并非总是如此,但通常情况下,类型转换只是重新解释构成某种类型的位与构成另一种类型的相同位。但是演员表也可能导致转换,例如(int)myFloat.
  • @RudyVelthuis 不,演员 从不 这样做。在某些情况下,您可以使用它来获得一个类型双关的指针并重新解释它。
  • @Quentin:那么下面的演员做了什么:int a = -17; unsigned int b = (unsigned int)a;。我称之为重新解释。
  • @RudyVelthuis 见the second bullet point here。一切都是根据表示的值而不是表示来定义的。例如,一个实现可能对负整数使用符号幅度表示,其位与模后相同数字的无符号表示不匹配。
  • @Quentin:描述的是转换,而不是转换。

标签: c uint32


【解决方案1】:

sprintf nul 终止它输出到提供的缓冲区的字符串。由于 %010lu 格式说明符要求填充的数字长度至少为 10 位,因此您一直在溢出 crc_buf 并触发 UB。在您的特定情况下,crc 的最低有效字节被践踏。

使crc_buf 11 个或更多字符,并使用snprintf 而不是sprintf 来捕获此类错误。为了获得最大的可移植性,您还可以使用 PRIu32 格式宏而不是强制转换:

snprintf(crc_buf, sizeof crc_buf, "%10" PRIu32, crc);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多