C语言中的整数及其相互转化

时间:2024-03-22 08:34:02

C中支持多种整数类型。

C语言中允许无符号整数与带符号整数的相互转化,转化前后的机器数不变,只是前后的解释发生了变化。

例如:

1、

int main()
{
	int x=-1;
	unsigned u=2147483648;
	printf("%u  %d\n",x,x);
	printf("%u  %d\n",u,u);
	return 0;
 } 

输出结果:
C语言中的整数及其相互转化
在上面的代码中,x是int 类型,且其代码在32位二进制中的表示为 1+30个0+1,但是数据在储存的时候是用补码来储存的,且其补码为 32个1,则当其为有符号数时自然为-1,但是用无符号数来解释的时候得到的是一串1的正整数,其值为 2的32次方-1 ,也就是4294967295;
在unsigned中2147483648的二进制表示为1000…0,按无符号数输出是没问题,但是按有符号的来解释的话就是最小负数 -2147483648;

2、
又有 -2147483648 < 2147483647 在ISO C90标准中,这个的结果却是 false , 编译器对表达式编译时,将
-2147483648分为 2147483648 和 - 两部分来处理,因为2147483648 超出了 int 的范围,编译器将 -2147483648 自动转化为unsigned int 类型,那么前者就成了一个无符号整数,那么和前面一比,自然是false ;

又-1<2147483647 ,这个是true 因为两者都没超过int 的常量范围,不会自动转化,所以就符合大小的比较。

又 如果定义 int i= - 2147483648 ,i<2147483648 这个是成立的,因为实现定义了 int 类型的变量, 不会即使超出了范围,也不会自动转化,因此 此式成立。

C语言中的整数及其相互转化