我最近提出了一个问题。假设我们有:C函数:将带符号参数的函数赋值为无符号变量
void test(int32_t b){
printf("value is %d", b);
}
int main(){
uint32_t a = 43;
test(a);
return 0;
}
将无符号变量传递给带符号参数会发生什么?价值的副本如何工作,演员如何工作?
有人可以向我详细解释一下吗?
谢谢
我最近提出了一个问题。假设我们有:C函数:将带符号参数的函数赋值为无符号变量
void test(int32_t b){
printf("value is %d", b);
}
int main(){
uint32_t a = 43;
test(a);
return 0;
}
将无符号变量传递给带符号参数会发生什么?价值的副本如何工作,演员如何工作?
有人可以向我详细解释一下吗?
谢谢
如果该值足够小,则只需指定它。否则,它以实现定义的方式分配。通常这意味着它将“环绕”。
6.3.1.3-1
当与整数类型的值被转换为另一种类型整数大于 _Bool,其他如果该值可以通过新的类型来表示,它 是不变。
否则,如果新类型是无符号的,所述值是通过 转换反复加上或减去小于 可以在新的类型,直到该值是在 新类型的范围内表示的最大值一个更。
否则,新类型有符号且其值不能被表示为 ;结果是实现定义的或实现定义的信号被引发。
我认为该数据类型的转换是透明的,但需要注意。如果uint32_t的值较大,则int32_t可以保留,那么int32_t会转换为不合需要的值。
a
被转换为b
的类型,就好像通过赋值一样。
(C99,6.5.2.2p7)“如果它表示所调用的函数的表达有一个类型确实包括一个原型,参数被隐式转换,仿佛被分配到种类相应的参数,将每个参数的类型作为其声明类型的非限定版本。“
在你的情况下,如果要转换的值可以用新类型表示,则保持不变。
(C99,6.3.1.3p1)“当用整数类型的值被转换为比其它_Bool另一个整数类型,如果该值可以通过新的类型来表示,它是不变的”。
否则它被转换在一个实施方式定义:
(C99,6.3.1.3p3)“否则,新的类型是有符号和值不能在它来表示;可以是结果是实现定义的或者实现定义的信号被引发。“