【C语言】有符号整型(int) 与 无符号整型(unsigned int)的运算

文章讨论了在C语言中,有符号整型(int)和无符号整型(unsignedint)在运算时的行为。全局和静态变量未初始化时默认为0,局部变量未初始化则可能产生随机值。在进行关系运算时,有符号整型会转换为无符号整型,而在算术运算中,两者依然正常进行。文章通过示例解释了当有符号整型参与无符号运算时,如何进行类型转换以及可能出现的数值异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
	有符号整型(int) 与 无符号整型(unsigned int)的运算
		1.全局变量,静态变量都是放在静态区,不初始化的时候,默认值为0。
		  局部变量,放在栈区,不初始化的时候,默认值是随机值,编译器会报错
		2.int 与 unsigned int 进行关系运算(比较大小),int会转换为unsigned int。
		  除此之外,int 与 unsigned int 仍然进行正常的算术运算
		  
*/

#include <stdio.h>

int i;//全局变量
int main() {
	printf("%d\n",i);//0
	i--;//-1
	//sizeof()的返回结果是size_t类型的,是无符号整型。
	//当有符号整型和无符号整型进行运算时,int(有符号整型)会转换为unsigned int(无符号整型)来运行
	//10000000 00000000 00000000 00000001   -1的原码
	//11111111 11111111 11111111 11111110   反码
	//11111111 11111111 11111111 11111111   内存中-1的补码  作为无符号整型就是一个很大的数,2的32次方-1= 4,294,967,295

	if (i > sizeof(i)) { //4,294,967,295  >  4
		printf(">\n");
		printf("%d\n", i - sizeof(i));// %d表示打印有符号整型,(-1)-4 = -5  正常的进行算术运算!
		//11111111 11111111 11111111 11111111   内存中-1的补码  是无符号数
		//00000000 00000000 00000000 00000100   4的补码
		//11111111 11111111 11111111 11111011   内存中(-1)-4后的补码 因为输出格式为%d,所以需要转换为有符号数,最高位1为符号位,表示负数
		//11111111 11111111 11111111 11111010   反码
		//10000000 00000000 00000000 00000101   原码 -5

		//或者使用补码来直接计算,最高位符号位权重为-2的31次方。  (-2^31) + [(2^31)-1]-4 = -5

		printf("%u\n", i - sizeof(i)); // %u表示打印无符号整型
		//11111111 11111111 11111111 11111111   内存中-1的补码  是无符号数
		//00000000 00000000 00000000 00000100   4的补码
		//11111111 11111111 11111111 11111011   内存中(-1)-4后的补码,因为输出格式为%u,所以需要转换为无符号数,
		                                        //最高位1不是符号位,结果就是(2的32次方-1)-4 = 4,294,967,291

		//直接使用补码来计算,最高位不是符号位,权重为2的31次方。  [(2^32)-1] - 4 = 4,294,967,291
	}
	else {
		printf("<\n");
	}

	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值