2012-05-30 73 views
5

我最近提出了一个问题。假设我们有:C函数:将带符号参数的函数赋值为无符号变量

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

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

将无符号变量传递给带符号参数会发生什么?价值的副本如何工作,演员如何工作?

有人可以向我详细解释一下吗?

谢谢

回答

5

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

6.3.1.3-1

当与整数类型的值被转换为另一种类型整数大于 _Bool,其他如果该值可以通过新的类型来表示,它 是不变

否则,如果新类型是无符号的,所述值是通过 转换反复加上或减去小于 可以在新的类型,直到该值是在 新类型的范围内表示的最大值一个更。

否则,新类型有符号且其值不能被表示为 ;结果是实现定义的或实现定义的信号被引发。

2

我认为该数据类型的转换是透明的,但需要注意。如果uint32_t的值较大,则int32_t可以保留,那么int32_t会转换为不合需要的值。

3

a被转换为b的类型,就好像通过赋值一样。

(C99,6.5.2.2p7)“如果它表示所调用的函数的表达有一个类型确实包括一个原型,参数被隐式转换,仿佛被分配到种类相应的参数,将每个参数的类型作为其声明类型的非限定版本。“

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

(C99,6.3.1.3p1)“当用整数类型的值被转换为比其它_Bool另一个整数类型,如果该值可以通过新的类型来表示,它是不变的”。

否则它被转换在一个实施方式定义:

(C99,6.3.1.3p3)“否则,新的类型是有符号和值不能在它来表示;可以是结果是实现定义的或者实现定义的信号被引发。“