【发布时间】:2017-10-02 04:35:32
【问题描述】:
在我前几天偶然发现的以下代码 sn-p 中,它将signed int 传递给期望unsigned int 的函数
#include "stdio.h"
void set_data(unsigned int* addr, const unsigned int data)
{
printf("Inside set_data:%d\n", data);
*addr = data;
}
int main() {
unsigned int a = 2;
printf("Before set_data:%d\n", a);
set_data(&a, -10);
printf("After set_data:%d\n", a);
return 0;
}
输出:-
请注意,编译器不会抛出任何警告:-
zhossain@zhossain-linux1:~$ gcc -Wall test.c
zhossain@zhossain-linux1:~$ ./a.out
Before set_data:2
Inside set_data:-10
After set_data:-10
问题:-
1、为什么编译器不喊?隐式转换?
2.为什么“Inside set_data”打印的是负整数,而data被明确定义为unsigned int
3.这是否有可能是未定义的行为或定义的实现,这可能不是编写安全可移植代码的好习惯?
期待详细的解释,如果您能指出相关的 SO 线程,也将不胜感激
【问题讨论】:
-
好吧,因为
int将始终适合unsigned,(2)您告诉printf将a中的位解释为int(看看@ 987654332@ 整数存储以获取更多详细信息)。代码定义明确。 -
#2
printf("Inside set_data:%d\n", data);在data>INT_MAX时是 UB。 -
@chux -
printf()在格式说明符指定与相应参数不同的类型时具有未定义的行为。 -
@peter C11 §6.5.2.2 6 和 §7.21.6.1 9 存在一定程度的不一致,可以解释为
int/unsigned值的表示方式与printf()相同,与"%u/%d"无法区分.在这种情况下,OP 的unsigned值肯定是 >INT_MAX等等 UB。
标签: c type-conversion implicit-conversion