十进制数值字符串转各种位宽的整形数据demo
本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。需要注意的是字符串需要按照严格的输入要求输入才行,比如“-127”,“255”等,除了第一个字符可以是负号‘-’外,其他字符必须是数字,对应位宽的数字字符,必须选择对应的函数。demo如下,可以直接拷贝到C语言编译器,编译允许即可获得结果。
  • #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 头条@单片机嵌入式爱好者 ----------------*/
  • 运行结果如下:
  • a1=-128
  • a2=255
  • b1=-32768
  • b2=65535
  • c1=2147483648
  • c2=4294967295
  • d1=-9223372036854775808
  • d2=18446744073709551615
  • 复制代码

    来源:单片机嵌入式爱好者