【问题标题】:Increment/Decrement byte (char) in c++ with over/under-flowc++ 中的递增/递减字节(char),带有上溢/下溢
【发布时间】:2015-02-09 16:49:43
【问题描述】:

在考虑上溢和下溢的同时,在 c++ 中递增/递减字节的最佳方法是什么?例如,我有:

char c = random byte;
c += 0xB;

如果 c

假设c = 0xFF,相加后会是0xA吗?同样下溢,如果c = 0,结果会是0xF5吗?

此外,由于某些奇怪的原因,当我增加特定数字时,会出现奇怪的结果。例如,如果我将 0x0 增加 0xA,使用代码:

c = (c + 0xA) & 0xFF;

结果是:0x0D 0x0A 而不仅仅是 0x0A... 如下图所示:

而所有其余字节都正确增加。

【问题讨论】:

  • 我无法识别单个递增或递减操作。
  • 由于我不是母语人士,因此我不确定我是否使用了正确的词来描述该操作,但这就是我所说的增量:c = (c + 0xA)。我也只是编辑了代码,因为我忘记适当地更改代码中使用的变量。 @πάνταῥεῖ
  • 你想用它来加密吗?也许您想改用exclusive or
  • @BraveHeart 这叫做加法(反之是减法)。加/减1时,通常使用自增/自减。
  • 至少就0A 而言,您在Windows 系统上似乎非常清楚,并且您的文件I/O 有助于将\n 转换为\r\n(本机行尾指示器)为您服务。

标签: c++ byte overflow increment underflow


【解决方案1】:

我至少可以用0x0 by 0xA 解释你的结果:在Windows 上,文本文件中的换行符通常表示为\r\n 而不是\n,文件I/O 函数将有助于为你进行翻译。在这种情况下,您不希望进行转换,因此您可以以二进制模式打开文件,这将禁止自动转换。

至于处理溢出,如果您能够使用unsigned char 而不是char,则可以保证对溢出和下溢具有明确定义的模运算。

如果您需要处理已签名的过度/不足流,则必须仔细编写所需的所有逻辑。

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多