整数 overflow/underflow
Integer overflow/underflow
我正在学习整数上溢和下溢,想知道是否可以通过给负输入 n 来控制 j 的值?
int i = n;
size_t j = i;
printf("%lu",j);
例如,如果我希望 "j" 的值为 255,是否可以制作负数 "n" 来给我输出?
我想你要找的是
signed char i = -1;
unsigned char j = i;
printf("%u\n", j);
在8位中,有符号数-1"wraps around"到无符号数255.
您询问 size_t
是因为,是的,它是一种无符号类型,但通常是 32 位甚至 64 位。在这些大小下,数字 255 在有符号和无符号变体中都是可表示的(并且具有相同的表示),因此没有对应于 255 的负数。但是您当然可以看到类似的效果,使用不同的值。例如,在具有 32 位整数的机器上,此代码:
unsigned int i = 4294967041;
int j = i;
printf("%d\n", j);
可能会打印 -255。这个值的产生是因为 2^32 - 255 = 4294967041.
我正在学习整数上溢和下溢,想知道是否可以通过给负输入 n 来控制 j 的值?
int i = n;
size_t j = i;
printf("%lu",j);
例如,如果我希望 "j" 的值为 255,是否可以制作负数 "n" 来给我输出?
我想你要找的是
signed char i = -1;
unsigned char j = i;
printf("%u\n", j);
在8位中,有符号数-1"wraps around"到无符号数255.
您询问 size_t
是因为,是的,它是一种无符号类型,但通常是 32 位甚至 64 位。在这些大小下,数字 255 在有符号和无符号变体中都是可表示的(并且具有相同的表示),因此没有对应于 255 的负数。但是您当然可以看到类似的效果,使用不同的值。例如,在具有 32 位整数的机器上,此代码:
unsigned int i = 4294967041;
int j = i;
printf("%d\n", j);
可能会打印 -255。这个值的产生是因为 2^32 - 255 = 4294967041.