【发布时间】:2019-11-06 03:59:30
【问题描述】:
我已将 -1 分配给 unsigned int 并假设它会产生错误我编译了代码,令我惊讶的是它没有。我无法理解背后的原因。
我尝试打印值以手动检查它们,但它总是显示 -1。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char *argv[]) {
unsigned int x = -1;
printf("%u\n", x);
int y = -1;
printf("%d\n", y);
if (x == y) {
printf("\nsame");
} else {
printf("n s");
}
return 0;
}
预期的结果是错误或警告 但它按原样编译。
【问题讨论】:
-
也许看看这个问题Your Answer
-
是时候了解two's complement(这是在二进制计算机上表示负整数值的最常用方法)。
-
如果您使用 gcc,请尝试使用选项 -wall 进行编译(所有警告)。
-
@SirJoBlack - 所有 C 标准都指定了该行为。从历史上看,它在 C 中是这样指定的,因为所有现实世界的实现都是这样。情况仍然如此。它是有符号整数上溢或下溢,会产生未定义的行为,并且硬件的处理方式有所不同。
标签: c unsigned-integer