C函数:将无符号变量赋值给带有signed参数的函数

时间:2012-05-30 19:59:05

标签: c casting

我最近提出了一个问题。假设我们有:

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

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

将无符号变量传递给有符号参数时会发生什么?值的副本如何工作,以及演示如何工作?

有人能详细解释一下吗?

由于

3 个答案:

答案 0 :(得分:5)

如果值足够小,则只需分配。否则,它以实现定义的方式分配。通常这意味着它将“环绕”。

  

6.3.1.3-1

     

当整数类型的值转换为另一个整数类型时   除了_Bool之外,如果值可以用新类型表示,那么   没有改变

     

否则,如果新类型是无符号的,则转换为   重复加或减一个以上的最大值   可以用新类型表示,直到值在范围内   新类型。

     

否则,新类型已签名且无法表示该值   在里面;结果是实现定义的还是   提出了实现定义的信号。

答案 1 :(得分:3)

a转换为b类型,就像通过分配一样。

  

(C99,6.5.2.2p7)“如果表示被调用函数的表达式具有包含原型的类型,则参数被隐式转换,就像通过赋值一样,转换为相应参数的类型,每个参数的类型是其声明类型的非限定版本。“

在您的情况下,如果要转换的值可以在新类型中表示,则保持不变。

  

(C99,6.3.1.3p1)“当整数类型的值转换为除_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它不会改变。”

否则以实现定义的方式转换:

  

(C99,6.3.1.3p3)“否则,新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。”

答案 2 :(得分:2)

我认为转换对于该数据类型是透明的,但需要谨慎。如果uint32_t的值较大,则int32_t可以保持,则int32_t rollsover变为不合需要的值。