c语言的强制类型转换

#include <stdio.h>

void main()

{

int n=-5;

unsigned int a,b;

a=(unsigned int )n;

scanf("%u",&b);

printf("%u %u\n",a,b);

printf("%d %d",a,b);

}

//为啥强制转换不成功 ,
// 希望解释一下,以及 成功从int 到unsiged int 的转换效果能直接去除负符号吗
QQ图片20200302181909.png

回答:

问题不只在强制转换,而在 printf

%d 要的是 int, %u 要的是 unsigned int 。给的变量类型与指示不一致是一个未定义行为,意味编译器想干什么都可以。


整形强制转换至无符号类型,用的是模 2^N 的方式。负数一般都是转换到一个很大的正数。

C11 6.3.1.3/2

Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.


你说的去掉负号,应该是取绝对值吧,那是 abs() 函数,在 <stdlib.h> 里。

回答:

都成功了。对于c来说,int 到unsiged int的类型转换其实什么都不做,在内存中,a和n的内容是完全一样的,对于printf函数来说,它不知道压入堆栈的实参类型也不关心,不管是int还是unsigned int对printf来说都是一样的,只是根据%u或者%d来进行不同的格式化。

以上是 c语言的强制类型转换 的全部内容, 来源链接: utcz.com/p/194702.html

回到顶部