我最近想出了一个问题。假设我们有:
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以外的其他整数类型时,如果该值可以用新的类型表示,则保持不变。
否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。
否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。
a
b
好像通过赋值转换为的类型。
(C99, 6.5.2.2p7) “如果表示被调用函数的表达式具有包含原型的类型,则参数将隐式转换为相应参数的类型,就像通过赋值一样,采用每个参数的类型参数是其声明类型的非限定版本。”
在您的情况下,如果要转换的值可以用新类型表示,则保持不变。
(C99, 6.3.1.3p1) “当一个整数类型的值被转换为除_Bool之外的另一个整数类型时,如果该值可以用新的类型表示,则保持不变。”
否则以实现定义的方式进行转换:
(C99,6.3.1.3p3)“否则,新类型是有符号的,并且值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。”
我相信该数据类型的转换是透明的,但需要谨慎。如果 uint32_t 的值大于 int32_t 可以保持的值,则 int32_t 翻转为不希望的值。