二进制转换时的十六进制与十进制

Nic*_*ndo 1 c++ binary hex decimal

例如,以下是两种设置整数变量的方法(比如说C++):

int x = 0xFF;
int y = 255;
Run Code Online (Sandbox Code Playgroud)

哪个语句编译得更快,将实际位设置为整数值?

编辑:*编译从执行更改.我假设转换为二进制是在执行时,但似乎是在编译时给定@ muntoo的答案

Mik*_*vey 8

执行时间完全没有区别,编译速度可能没有差别.

添加以回应评论:
这是发生的事情.编译器有一个解析器,可能是递归下降的,在底部调用一个词法分析器来获取令牌.在这种情况下,令牌后面=是一个数字,它可以通过前导数字来表示,所以它是这样的,其中pc是指向当前字符的指针:

if (isdigit(*pc)){
  intpart = 0;
  if (pc[0]=='0' && pc[1]=='x'){
    pc += 2;
    while(ishexdigit(*pc)){
      intpart *= 16;
      if (isdigit(*pc)){
        intpart += (*pc - '0')
      }
      else {
        intpart += (tolower(*pc) - 'a' + 10);
      }
      pc++;
    }
  }
  else {
    while(isdigit(*pc)){
      intpart *= 10;
      intpart += (*pc - '0');
      pc++;
    }
    if (*pc == '.'){
      // ... handle fractional part
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,你可以看到,这是一个非常紧密的循环,它isdigitishexdigittolower在的每一个字符,和乘法,减法和加法一次或两次.假设这些函数是在线的,我们说每个字符可能有10-20条指令.在十六进制情况下,每个字符可能稍微多一些指令,但十进制数字会有更多的字符,因此很难说先验哪个应该更快.这只发生在您有能力在代码中键入的此类整数的总数,例如可能在100左右.如果机器可以执行,例如,每秒10 ^ 8条指令,它可以按周围的速率读取数字每秒10 ^ 7,或每个字符大约100纳秒,或者对于文件中的所有数字为10微秒,给出或采取一个数量级.

一旦编译器知道它是一个数字,它就会成为抽象语法树的一部分,它用于生成汇编语言.到那时,它是十六进制或十进制的事实早已被遗忘.它只知道它是某个值的二进制整数,所以汇编语言是相同的.

  • 编译速度可能有所不同,尽管这是一个微不足道的.:-) (2认同)