本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。需要注意的是字符串需要按照严格的输入要求输入才行,比如“-127”,“255”等,除了第一个字符可以是负号‘-’外,其他字符必须是数字,对应位宽的数字字符,必须选择对应的函数。demo如下,可以直接拷贝到C语言编译器,编译允许即可获得结果。
  1. #include <stdio.h>
  2. #include <string.h>

  3.     /* exact-width signed integer types */
  4. typedef   signed          char int8_t;
  5. typedef   signed short     int int16_t;
  6. typedef   signed           int int32_t;
  7. typedef   signed       long long int64_t;

  8.     /* exact-width unsigned integer types */
  9. typedef unsigned          char uint8_t;
  10. typedef unsigned short     int uint16_t;
  11. typedef unsigned           int uint32_t;
  12. typedef unsigned       long long uint64_t;
  13. int8_t cAto8(const char * pcString,uint8_t ucLength){
  14.     int8_t cInt8 = 0;
  15.     uint8_t ucI = 0;
  16.     if(pcString[ucI] == '-'){//
  17.         ucI++;
  18.     }
  19.     for(;ucI<ucLength;ucI++){
  20.         cInt8 = cInt8*10 + pcString[ucI]-'0';
  21.     }
  22.     if(pcString[0] == '-'){//
  23.         cInt8 = ~cInt8 + 1;
  24.     }
  25.     return cInt8;
  26. }

  27. uint8_t ucAtou8(const char * pcString,uint8_t ucLength){
  28.     uint8_t ucInt8 = 0;
  29.     uint8_t ucI = 0;
  30.     for(;ucI<ucLength;ucI++){
  31.         ucInt8 = ucInt8*10 + pcString[ucI]-'0';
  32.     }
  33.     return ucInt8;
  34. }
  35. int16_t sAto16(const char * pcString,uint8_t ucLength){
  36.     int16_t sInt16 = 0;
  37.     uint8_t ucI = 0;
  38.     if(pcString[ucI] == '-'){//
  39.         ucI++;
  40.     }
  41.     for(;ucI<ucLength;ucI++){
  42.         sInt16 = sInt16*10 + pcString[ucI]-'0';
  43.     }
  44.     if(pcString[0] == '-'){//
  45.         sInt16 = ~sInt16 + 1;
  46.     }
  47.     return sInt16;
  48. }
  49. uint16_t usAtou16(const char * pcString,uint8_t ucLength){
  50.     uint16_t usInt16 = 0;
  51.     uint8_t ucI = 0;
  52.     for(;ucI<ucLength;ucI++){
  53.         usInt16 = usInt16*10 + pcString[ucI]-'0';
  54.     }
  55.     return usInt16;
  56. }
  57. int32_t iAto32(const char * pcString,uint8_t ucLength){
  58.     int32_t iInt32 = 0;
  59.     uint8_t ucI = 0;
  60.     if(pcString[ucI] == '-'){//
  61.         ucI++;
  62.     }
  63.     for(;ucI<ucLength;ucI++){
  64.         iInt32 = iInt32*10 + pcString[ucI]-'0';
  65.     }
  66.     if(pcString[0] == '-'){//
  67.         iInt32 = ~iInt32 + 1;
  68.     }
  69.     return iInt32;
  70. }
  71. uint32_t uiAtou32(const char * pcString,uint8_t ucLength){
  72.     uint32_t uiInt32 = 0;
  73.     uint8_t ucI = 0;
  74.     for(;ucI<ucLength;ucI++){
  75.         uiInt32 = uiInt32*10 + pcString[ucI]-'0';
  76.     }
  77.     return uiInt32;
  78. }
  79. int64_t lAto64(const char * pcString,uint8_t ucLength){
  80.     int64_t lInt64 = 0;
  81.     uint8_t ucI = 0;
  82.     if(pcString[ucI] == '-'){//
  83.         ucI++;
  84.     }
  85.     for(;ucI<ucLength;ucI++){
  86.         lInt64 = lInt64*10 + pcString[ucI]-'0';
  87.     }
  88.     if(pcString[0] == '-'){//
  89.         lInt64 = ~lInt64 + 1;
  90.     }
  91.     return lInt64;
  92. }
  93. uint64_t ulAtou64(const char * pcString,uint8_t ucLength){
  94.     uint64_t ulInt64 = 0;
  95.     uint8_t ucI = 0;
  96.     for(;ucI<ucLength;ucI++){
  97.         ulInt64 = ulInt64*10 + pcString[ucI]-'0';
  98.     }
  99.     return ulInt64;
  100. }
  101. main(int argc, char *argv[])
  102. {
  103.     int8_t a1;
  104.     uint8_t a2;
  105.     int16_t b1;
  106.     uint16_t b2;
  107.     int32_t c1;
  108.     uint32_t c2;
  109.     int64_t d1;
  110.     uint64_t d2;
  111.     a1 = cAto8("-128",strlen("-128"));
  112.     printf("a1=%d\r\n",a1);
  113.     a2 = ucAtou8("255",strlen("255"));
  114.     printf("a2=%d\r\n",a2);
  115.     b1 = sAto16("-32768",strlen("-32768"));
  116.     printf("b1=%d\r\n",b1);
  117.     b2 = usAtou16("65535",strlen("65535"));
  118.     printf("b2=%d\r\n",b2);
  119.     c1 = iAto32("-2147483648",strlen("-2147483648"));
  120.     printf("c1=%ld\r\n",c1);
  121.     c2 = uiAtou32("4294967295",strlen("4294967295"));
  122.     printf("c2=%u\r\n",c2);
  123.     d1 = lAto64("-9223372036854775808",strlen("-9223372036854775808"));
  124.     printf("d1=%ld\r\n",d1);
  125.     d2 = ulAtou64("18446744073709551615",strlen("18446744073709551615"));
  126.     printf("d2=%lu\r\n",d2);
  127.     return 0;
  128. }

  129. /*-------------------(C) COPYRIGHT 2020 头条@单片机嵌入式爱好者 ----------------*/

  130. 运行结果如下:

  131. a1=-128
  132. a2=255
  133. b1=-32768
  134. b2=65535
  135. c1=2147483648
  136. c2=4294967295
  137. d1=-9223372036854775808
  138. d2=18446744073709551615


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