请参考printf()手册,其中写道:
指定要应用的转换类型的字符。 转换说明符及其含义如下:
d,i
int参数将转换为有符号十进制表示法。 精度(如果有)提供必须出现的最小数字; 如果转换后的值需要更少的数字,则在左侧用零填充。 默认精度为1。 当使用显式精度0打印0时,输出为空。
因此,这意味着即使参数以unsigned
表示方式给出,它也将被转换为其signed int
表示形式并打印出来,请参见以下代码示例:
#include <stdio.h>
int main(){
signed int x1 = -2147483648;
unsigned int x2 = -2147483648;
unsigned long long x3 = -2147483648;
printf("signed int x1 = %d\n", x1);
printf("unsigned int x2 = %d\n", x2);
printf("signed long long x3 = %d\n", x3);
}
这是输出结果:
signed int x1 = -2147483648
unsigned int x2 = -2147483648
signed long long x3 = -2147483648
这意味着无论打印的变量类型是什么,只要您指定了%d
作为格式说明符,该变量将被转换为其在signed int
中的表示形式并进行打印。
对于unsigned char
的情况,例如:
#include <stdio.h>
int main(){
unsigned char s = -10;
printf("s = %d",s);
}
输出为:
s = 246
由于 unsigned char s = -10
的二进制表示为:
1111 0110
当最高位为1时,但当它被转换为有符号整数
时,新的表示形式是:
0000 0000 0000 0000 0000 0000 1111 0110
因此,最高有效位不再具有表示数字是正数还是负数的1位。