【问题标题】:Integer overflow/underflow整数上溢/下溢
【发布时间】:2018-02-28 23:13:01
【问题描述】:

我正在学习整数上溢和下溢,想知道是否可以通过给出负输入 n 来控制 j 的值?

int i = n;
size_t j = i;
printf("%lu",j);

例如,如果我希望“j”的值为 255,是否可以制作负数“n”来给我那个输出?

【问题讨论】:

  • 是的!您可以将n 设置为 255。:-P
  • 没有“整数下溢”这样的事情,在普遍接受的命名法中,“下溢”只能发生在浮点运算中。作为您的问题,答案很简单:只需将您的n 设置为255。答案的简单性和琐碎性使人怀疑您在问题中遗漏了某些内容。
  • 对不起,我的意思是给出负值。我已经更新了问题
  • n的类型是什么?无论如何,如果不知道size_t 类型的确切特征(特别是它的范围),就不可能回答关于n 负值的问题。它依赖于平台。您应该使用%zu 打印size_t 值,而不是%lu
  • 如果您将包含-1 的变量转换为uint8_t,您将得到255。但是,255 小于 0x8000,因此我认为您无法通过将负数转换为任何大于 8 位的整数类型来获得它。不用说,我认为你不会找到任何unsigned long 大小仅为 8 位的现代平台(或古代平台)。

标签: c integer-overflow unsigned-integer


【解决方案1】:

我认为你正在寻找的是

signed char i = -1;
unsigned char j = i;
printf("%u\n", j);

在 8 位中,有符号数 -1 “环绕”为无符号值 255。

您询问size_t 是因为,是的,它是一个无符号类型,但它通常是 32 位甚至 64 位。在这些大小下,数字 255 在有符号和无符号变体中都是可表示的(并且具有相同的表示),因此没有对应于 255 的负数。但是您当然可以看到使用不同值的类似效果。例如,在具有 32 位整数的机器上,此代码:

unsigned int i = 4294967041;
int j = i;
printf("%d\n", j);

可能会打印 -255。这个值的产生是因为 2^32 - 255 = 4294967041。

【讨论】:

  • 在后面的代码中,行为是实现定义的(并且可能引发信号)
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2011-08-12
  • 2022-01-07
  • 1970-01-01
  • 2021-10-01
  • 2022-01-21
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多