¿Por qué uint es tan popular?

Entre todos los tutoriales/ejemplos del mundo real, todavía tengo que encontrarme con alguien que use el tipo de datos int, casi pensé que no existía ninguno... ¿Hay alguna razón específica para el dominio indiscutible de uint?

Respuestas (2)

Es inusual necesitar números negativos. Si no necesita números negativos, no hay razón para usar un int, y es (ligeramente) más fácil escribir código seguro para números positivos si no tiene que preocuparse por lo que sucede si son negativos. (Digo "ligeramente" porque en Solidity todavía tienes que preocuparte por uintel desbordamiento).

Para la mayoría de los propósitos prácticos, inttambién funcionaría, ya que todo lo uintque puede representar también puede representarse con int, a menos que sea un número muy grande. Pero si tiene la intención de representar un número positivo, debe usar un tipo de datos destinado a representar un número positivo.

Si necesita manejar números negativos además de números positivos, use un archivo int.

En otros lenguajes de programación, he visto una verificación de negativo utilizada para verificar el desbordamiento. En lugar de tener que razonar sobre qué tipo de número positivo resultará en un desbordamiento, una simple verificación de negativo lo maneja. Y tener un bit menos para representar valores grandes rara vez importa. Por estas razones, el argumento es que ints son más simples. ¿Se puede usar este truco con ints en Solidity también?
Verificar un negativo no sería suficiente para verificar un desbordamiento porque podría desbordarse nuevamente y producir un gran número positivo.

Como dijeron los otros carteles, si no necesita un número negativo. Un uint le dará más espacio, también parece más eficiente dentro del EVM.

https://ethfiddle.com/mCES1Jc3bH

  pragma solidity ^0.4.18;
  contract TestInt {
    uint value1;
    function setVal(uint _value) public {
      value1 = _value + 10;
    }

    function getVal() public  returns (uint) {
      return value1;
    }

    int value2;
    function set2(int _value) public {
      value2 = _value + 10;
    }

    function get2() public  returns (int) {
      return value2;
    }
    uint value;
  } 
La diferencia de gas aquí se debe al orden en que se enumeran las diversas funciones en el código de bytes. No tiene que ver con int/ uinten este caso. Puede confirmar intercambiando la ints y uintsen su código: los mismos resultados pero al revés. El código de bytes real generado para cada función es idéntico.
Ah, gracias, déjame actualizar eso, interesante, ¿entonces el orden de las funciones hace una diferencia para el uso de gas? eso es una locura
Es solo que el código tiene que pasar por las firmas de la función una por una para averiguar a qué fn está llamando (piense en ello como una declaración de "cambio"). Solidity inserta las firmas en el código de bytes en orden numérico, por lo que si su hashes de función a "0xff123456", entonces tomará más tiempo llegar (necesita más comparaciones) que "0x00123456". Los costos de gas involucrados son bastante insignificantes, pero si tiene una función que se usa con mucha frecuencia, podría nombrarla de tal manera que tiene una firma de función baja ¡Pero eso es un poco extremo!