无符号变量注意错误小点(不会常见,但是见到了估计一时半会也找不到问题)

本文深入探讨了C语言中无符号类型运算和输出格式的区别,通过实例展示了使用无符号类型进行算术运算后直接使用整型输出格式可能导致的误解,并强调了在编程时注意类型转换的重要性。

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

这几天在看那本《C和指针》 英文名《POINTERS ON C》[美]Keneth A.Reek著  徐波译

#include<stdio.h>
#include<string.h>
int main()
{
	unsigned int a=1,b=2;
//	if(a>b)printf("=%d", a-b);
	if((a-b)>0)printf("Why it will output this:%d?",a-b);

	
	/*
	int len1,len2;
	char buffer[] = "25,142,330,Smith,J,239-4123";
	
	len1 = strspn(buffer,"0123456789");// ,不是字符串中的所以返回2
	//若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。
	len2 = strspn(buffer,",0123456789");//S不是字符串中的 所以返回S所在的11
	printf("%d\n",len1);
	printf("%d\n",len2);
	*/
	
	return 0;
}

我们会发现if语句执行了?这是为什么,因为unsigned 型的算数运算后还是unsigned型,这里用于差值后结果比较会产生问题,以后要注意。

我在notepad++配置VS的编译器后输出结果是这样的:


仔细看上面的程序你会发现问题:我这里输出a-b的printf值用的是%d,这样无论如何也会输出-1的,如果改成%u就正确了。

这里可以单步调试设置断点观测c=a-b的值:


 


归结起来:编程对于无符号的判断时候要注意,尽量不要杂入算数运算,否则会产生不易察觉的错误。对于输出时候也应注意%d、%u的区别,这个只在C语言中存在,在C++中不会出现这种问题,cout在这点中做的很好,这也算是C++的一个优势。

谨记、谨记。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值