Serial.print uint64_t in Arduino

6

我使用 Arduino UNO(Arduino 1.8.3版本)。

这是我的代码:

void setup() { 
    Serial.begin(115200);
}
void loop() { 
    uint64_t num = 9223372036854775807; 
    Serial.print(num); 
    delay(1000);
}

这是错误信息:

退出状态为1

调用'print(uint64_t&)'存在歧义

我该如何解决这个错误?


请编辑您的问题,包括完整完整的错误输出。包括可能的信息注释。最好将所有内容都复制并粘贴到您的问题中(作为文本),不做任何修改。请花些时间阅读有关如何提出好问题的说明 - Some programmer dude
1
这是一个有用的问题,至少在它目前的形式下是如此。这正是我正在寻找的。 - Robert M.
3个回答

3
这是我的方法。虽然有点凌乱,但能完成任务。
串行控制台输出:9223372036854775807
void print_uint64_t(uint64_t num) {

  char rev[128]; 
  char *p = rev+1;

  while (num > 0) {
    *p++ = '0' + ( num % 10);
    num/= 10;
  }
  p--;
  /*Print the number which is now in reverse*/
  while (p > rev) {
    Serial.print(*p--);
  }
}

1
与其像其他地方建议的那样逐个打印字符,更好的方法是反向构建缓冲区,然后一次性打印它。
#include <stdint.h>
char* str( uint64_t num ) {
  static char buf[22];
  char* p = &buf[sizeof(buf)-1];
  *p = '\0';
  do {
    *--p = '0' + (num%10);
    num /= 10;
  } while ( num > 0 );
  return p;
}

char* str( int64_t num ) {
    if ( num>=0 ) return str((uint64_t)num);
    char* p = str((uint64_t)(-num));
    *--p = '-';
    return p;    
}

void setup() {
  int64_t num = -92233720368547758L; 
  Serial.print( str(num) );
}

1
@MooingDuck 这个问题无论如何都会被关闭。得爱SO。太有毒性了。 - Henrique Bucher
1
@njuffa 那是一个非常好的解决方案!可惜他们要删除这个问题了。 - Henrique Bucher
1
我想知道像这样的多少优秀内容被StackOverflow这些嫉妒的管理员压制了。这个网站上C++标签的毒性水平令人印象深刻。 - Henrique Bucher
1
不知道您是否有任何关于如何使用带符号整型int64_t实现此操作的想法? - Robert M.
1
这很好,谢谢。我不知道为什么我要测试最左边的位,而不是只测试是否>=0 lol。 - Robert M.
显示剩余2条评论

1
如果有人需要的话,我稍微修改了一下,使其适用于 int64_t(我改了函数名称,抱歉)。
char* getInt64Str( int64_t num ) {
  int64_t numAbs = abs(num);
  static char buf[22];
  char* p = &buf[sizeof(buf)-1];
  *p = '\0';
  do {
    *--p = '0' + (numAbs%10);
    numAbs /= 10;
  } while ( numAbs > 0 );
  if( (byte)((num & bit(64))>>63) == 1 ){
    *--p = '-';
  }
  return p;
}

1
我已经在上面的问题中添加了int64_t的实现。不需要修改原始内容。 - Henrique Bucher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接