我最近提出了一个问题。假设我们有:
void test(int32_t b){
printf("value is %d", b);
}
int main(){
uint32_t a = 43;
test(a);
return 0;
}
将无符号变量传递给有符号参数时会发生什么?值的副本如何工作,以及演示如何工作?
有人能详细解释一下吗?
由于
答案 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变为不合需要的值。