#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 的转换效果能直接去除负符号吗
#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 的转换效果能直接去除负符号吗
都成功了。对于c来说,int 到unsiged int的类型转换其实什么都不做,在内存中,a和n的内容是完全一样的,对于printf函数来说,它不知道压入堆栈的实参类型也不关心,不管是int还是unsigned int对printf来说都是一样的,只是根据%u或者%d来进行不同的格式化。
问题不只在强制转换,而在
printf
。%d
要的是int
,%u
要的是unsigned int
。给的变量类型与指示不一致是一个未定义行为,意味编译器想干什么都可以。整形强制转换至无符号类型,用的是模 2^N 的方式。负数一般都是转换到一个很大的正数。
C11 6.3.1.3/2
你说的去掉负号,应该是取绝对值吧,那是
abs()
函数,在<stdlib.h>
里。