我不小心使用了"%d";使用在线编译器打印无符号整数。我以为会弹出错误,但我的程序可以成功运行。我的代码能正常工作是件好事,但我就是不明白为什么。
#include <stdio.h>
int main() {
unsigned int x = 1;
printf( "%d", x);
return 0;
}
;无符号整数";小到无法设置MSB(最高有效位(。如果是的话,printf((会将该值视为";负符号整数";价值
int main() {
uint32_t x = 0x5;
uint32_t y = 0xC0000000;
printf( "%d %u %dn", x, y, y );
return 0;
}
5 3221225472 -1073741824
你可以看到区别。
有了新型的编译器;读入";printf格式说明符,并将其与以下参数的数据类型相匹配,可能是因为在线编译器可能无法报告这种类型不匹配并发出警告。这可能是你想要调查的事情。
参考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 = %dn", x1);
printf("unsigned int x2 = %dn", x2);
printf("signed long long x3 = %dn", 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
因为CCD_ 6的二进制表示是:
1111 0110
其中MSB位为1,但当它被转换为signed int
时,新的表示为:
0000 0000 0000 0000 0000 0000 1111 0110
因此MSB在其MSB中不再具有表示数字是正还是负的1位。
9有符号整数类型的非负值范围是相应无符号整数类型中的子范围,并且每个类型中相同值的表示是相同的。41(
41(相同的表示和对齐要求意味着作为函数的参数、函数的返回值和联合成员的互换性
7对象的存储值只能由具有以下类型之一的左值表达式访问。。。与对象的有效类型相对应的有符号或无符号类型
在需要有符号整数的地方传递无符号整数似乎不是未定义的行为,反之亦然,只要值在两种类型中都可以表示。
即使在最高警告级别,也没有现有的编译器对这种特定的不匹配发出警告,这也许不是巧合。