C函数:将无符号变量分配给带有有符号参数的函数

5

我最近想到了一个问题。假设我们有:

void test(int32_t b){
    printf("value is %d", b);
}

int main(){
    uint32_t a = 43;
    test(a);  
   return 0;
}

当你将一个无符号变量传递给有符号参数时会发生什么?值的复制过程是如何进行的,类型转换又是如何进行的呢?
可以有人详细地解释一下吗?
谢谢
3个回答

5
如果值足够小,则简单地分配。否则,它以一种实现定义的方式分配。通常这意味着它会“循环”。当一个具有整数类型的值转换为另一种整数类型(除了_Bool)时,如果该值可以由新类型表示,则保持不变。否则,如果新类型是无符号的,则通过反复添加或减去一个比新类型中可以表示的最大值多1的值,直到该值在新类型的范围内为止进行转换。否则,新类型为有符号类型且该值无法表示;结果要么是实现定义的,要么引发实现定义的信号。

3
a将被转换为b的类型,就像通过赋值一样。(C99,6.5.2.2p7)“如果表示被调用函数的表达式具有包括原型的类型,则参数会隐式转换为相应参数的类型,每个参数的类型均取其已声明类型的无限定版本。”
在您的情况下,如果要转换的值可以表示为新类型,则保持不变。(C99,6.3.1.3p1)“当具有整数类型的值转换为除_Bool以外的另一整数类型时,如果该值可以由新类型表示,则它不变。”
否则,它将以实现定义的方式进行转换:(C99,6.3.1.3p3)“否则,新类型是带符号的,且该值无法在其中表示;结果要么是实现定义的,要么会引发实现定义的信号。”

2

我相信对于这种数据类型的转换是透明的,但需要谨慎处理。如果uint32_t的值大于int32_t可以容纳的值,则int32_t会滚动到不希望的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接