十进制数值字符串转各种位宽的整形数据demo

 本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。需要注意的是字符串需要按照严格的输入要求输入才行,比如“-127”,“255”等,除了第一个字符可以是负号‘-’外,其他字符必须是数字,对应位宽的数字字符,必须选择对应的函数。demo如下。

#include <stdio.h>
#include <string.h>

    /* exact-width signed integer types */
typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef   signed       long long int64_t;

    /* exact-width unsigned integer types */
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned       long long uint64_t;
int8_t cAto8(const char * pcString,uint8_t ucLength){
	int8_t cInt8 = 0;
	uint8_t ucI = 0;
	if(pcString[ucI] == '-'){//
		ucI++;
	}
	for(;ucI<ucLength;ucI++){
		cInt8 = cInt8*10 + pcString[ucI]-'0';
	}
	if(pcString[0] == '-'){//
		cInt8 = ~cInt8 + 1;
	}
	return cInt8;
}

uint8_t ucAtou8(const char * pcString,uint8_t ucLength){
	uint8_t ucInt8 = 0;
	uint8_t ucI = 0;
	for(;ucI<ucLength;ucI++){
		ucInt8 = ucInt8*10 + pcString[ucI]-'0';
	}
	return ucInt8;
}
int16_t sAto16(const char * pcString,uint8_t ucLength){
	int16_t sInt16 = 0;
	uint8_t ucI = 0;
	if(pcString[ucI] == '-'){//
		ucI++;
	}
	for(;ucI<ucLength;ucI++){
		sInt16 = sInt16*10 + pcString[ucI]-'0';
	}
	if(pcString[0] == '-'){//
		sInt16 = ~sInt16 + 1;
	}
	return sInt16;
}
uint16_t usAtou16(const char * pcString,uint8_t ucLength){
	uint16_t usInt16 = 0;
	uint8_t ucI = 0;
	for(;ucI<ucLength;ucI++){
		usInt16 = usInt16*10 + pcString[ucI]-'0';
	}
	return usInt16;
}
int32_t iAto32(const char * pcString,uint8_t ucLength){
	int32_t iInt32 = 0;
	uint8_t ucI = 0;
	if(pcString[ucI] == '-'){//
		ucI++;
	}
	for(;ucI<ucLength;ucI++){
		iInt32 = iInt32*10 + pcString[ucI]-'0';
	}
	if(pcString[0] == '-'){//
		iInt32 = ~iInt32 + 1;
	}
	return iInt32;
}
uint32_t uiAtou32(const char * pcString,uint8_t ucLength){
	uint32_t uiInt32 = 0;
	uint8_t ucI = 0;
	for(;ucI<ucLength;ucI++){
		uiInt32 = uiInt32*10 + pcString[ucI]-'0';
	}
	return uiInt32;
}
int64_t lAto64(const char * pcString,uint8_t ucLength){
	int64_t lInt64 = 0;
	uint8_t ucI = 0;
	if(pcString[ucI] == '-'){//
		ucI++;
	}
	for(;ucI<ucLength;ucI++){
		lInt64 = lInt64*10 + pcString[ucI]-'0';
	}
	if(pcString[0] == '-'){//
		lInt64 = ~lInt64 + 1;
	}
	return lInt64;
}
uint64_t ulAtou64(const char * pcString,uint8_t ucLength){
	uint64_t ulInt64 = 0;
	uint8_t ucI = 0;
	for(;ucI<ucLength;ucI++){
		ulInt64 = ulInt64*10 + pcString[ucI]-'0';
	}
	return ulInt64;
}
main(int argc, char *argv[])
{
	int8_t a1;
	uint8_t a2;
	int16_t b1;
	uint16_t b2;
	int32_t c1;
	uint32_t c2;
	int64_t d1;
	uint64_t d2;
	a1 = cAto8("-128",strlen("-128"));
	printf("a1=%d\r\n",a1);
	a2 = ucAtou8("255",strlen("255"));
	printf("a2=%d\r\n",a2);
	b1 = sAto16("-32768",strlen("-32768"));
	printf("b1=%d\r\n",b1);
	b2 = usAtou16("65535",strlen("65535"));
	printf("b2=%d\r\n",b2);
	c1 = iAto32("-2147483648",strlen("-2147483648"));
	printf("c1=%ld\r\n",c1);
	c2 = uiAtou32("4294967295",strlen("4294967295"));
	printf("c2=%u\r\n",c2);
	d1 = lAto64("-9223372036854775808",strlen("-9223372036854775808"));
	printf("d1=%ld\r\n",d1);
	d2 = ulAtou64("18446744073709551615",strlen("18446744073709551615"));
	printf("d2=%lu\r\n",d2);
	return 0;
}
/*-------------------(C) COPYRIGHT 2020 头条@单片机嵌入式爱好者 ----------------*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值