C语言中的int、unsigned int 中的负数存取、隐式转换、越界等问题

本文通过示例代码探讨了C语言中int和unsignedint类型在存储负数、隐式类型转换以及可能出现的越界情况。在计算过程中,负数以补码形式存储,当unsignedint与负数进行运算时,会导致数值的非预期行为,如在加法运算中出现越界。

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

C语言中的int、unsigned int 中的负数存取、隐式转换、越界等问题

#include "stdio.h"

int main() {
	// Tips:
	// PC上 int 32 位,4字节
	// 补码: 正数取反 再加一
	// 隐式转化: 不同类型变量计算时,由低精度向高精度转换
	// unsigned int a = -6;   --> 不报错
	// 将以补码的形式存于a对于的地址空间,a = 1111 1111 1111 1111 1111 1111 1111 1010, 十进制数为:4294967290
	unsigned int a = -6;
	int b = -20;          // 将以补码的形式存于b对于的地址空间,b = 1111 1111 1111 1111 1111 1111 1110 1100, 十进制数为:4294967276
	printf("unsigned int a = - 6 --> the value of a is %u\n", a);
	printf("int b = - 20 --> the value of b transfered to \"unsigned int\" is %u\n", b);

	if ( (a + b) > 0 ) // 取 a 的时候,将以 unsigned int 的类型读出,此时 a = 1111 1111 1111 1010,转换为十进制;
		// 取b 的时候,由于存在隐式转换, b的补码, 将转换为 具体的数字
		// 即是说 4294967290 + 4294967276, 注意此时将会越界,故输出为 4294967270
		printf("TRUE, the value of (unsigned a) + (unsigned b) is %u\n", (a + b));
	else
		printf("FALSE, %u\n", (a + b));

	// 隐式转换,加法结果为 4294967290 + 4294967276, 并存在越界,最终结果为 4294967270, 输出为 TRUE
	((a + b) > 0) ? puts("TRUE") : puts("FALSE");

	// 读取 a 时,将会以int 型读取,而a 本身存储的就是 -6 的补码,故读取出来就是 -6, 输出为 FALSE
	(((int)a + b) > 0) ? puts("TRUE") : puts("FALSE");

	printf("TRUE, the value of (unsigned a) + (unsigned b) is %d\n", ((int)a + b));  // 此时,输出结果为 -26

	return 0;
}

运行结果如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值