我知道我正在给有符号整数赋一个超出它所能处理的值。此外,我应该使用%d
表示有符号数,%u
表示无符号数。同样地,我不应该给无符号数赋负值。但是,如果我进行这样的赋值并像下面这样使用printf,我会得到下面所示的结果。
我的理解是,在每种情况下,将数字转换为其二进制补码表示,对于-1
或4294967295
是相同的。这就是为什么对于有符号数,%u
会忽略左侧最高位的-ve
标志并打印4294967295
。当使用%d
表示有符号整数时,它使用最左侧的位作为-ve
标志,并打印-1
。同样地,%u
用于无符号打印无符号值,但%d
使其将数字视为有符号数,因此打印-1
。正确吗?
signed int si = 4294967295;
unsigned int ui = 4294967295;
printf("si = u=%u d=%d\n", si, si);
printf("ui = u=%u d=%d\n", ui, ui);
输出:
si = u=4294967295 d=-1
ui = u=4294967295 d=-1
signed int si = -1;
unsigned int ui = -1;
printf("si = u=%u d=%d\n", si, si);
printf("ui = u=%u d=%d\n", ui, ui);
输出:
si = u=4294967295 d=-1
ui = u=4294967295 d=-1