c-%d表示无符号整数



我不小心使用了"%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对象的存储值只能由具有以下类型之一的左值表达式访问。。。与对象的有效类型相对应的有符号或无符号类型

在需要有符号整数的地方传递无符号整数似乎不是未定义的行为,反之亦然,只要值在两种类型中都可以表示。

即使在最高警告级别,也没有现有的编译器对这种特定的不匹配发出警告,这也许不是巧合。

最新更新