Skip to main content

Command Palette

Search for a command to run...

Data Types in Solidity

Updated
4 min readView as Markdown
Data Types in Solidity

Data Types

Solidity is a statically typed language, which means that all variables must be declared with a specific data type before they can be used. Solidity has a wide range of data types that can be used for variables, function parameters, and return values. Here are the most commonly used data types in Solidity:

  • In Solidity, variables can have different access levels, such as public, private, internal, and external. By default, state variables are internal, which means they are accessible within the contract and its derived contracts.

    If an access modifier is not specified while declaring a state variable, it will be automatically assigned the internal access level. However, it is considered good practice to explicitly define the access level of a variable to avoid any confusion and make the code more readable.

    For example, you can declare a uint variable with a public access modifier as follows:

      csharpCopy codeuint public myVariable;
    

    This will create a public state variable that can be accessed from outside the contract.

  • bool: Boolean value that can be either true or false.

  • uint: Unsigned integer, which can hold positive integers of various sizes. It can be further defined by appending the number of bits, such as uint8, uint16, uint32, uint64, uint128, uint256, etc.

  • int: Signed integer, which can hold positive and negative integers of various sizes. It can be further defined by appending the number of bits, such as int8, int16, int32, int64, int128, int256, etc.

  • address: Holds a 20-byte value that represents an Ethereum address.An Ethereum address is a unique identifier that represents an account on the Ethereum blockchain.string: A variable-length string of UTF-8 encoded characters.

  • bytes: A variable-length byte array that can hold any data.

  • mapping: A data structure that maps a key to a value. The key can be any value that is not a mapping or an array.

  • array: A fixed-size or dynamic array of a specific data type.

In addition to these data types, Solidity also has more advanced types such as structs, enums, and contracts. These types can be used to define custom data structures and contracts with their own methods and variables.

Some Exceptional Cases

  1. In Solidity, when assigning a value of a larger data type to a variable of a smaller data type, you need to explicitly cast the value to the smaller data type using a typecast. In this case, you need to cast the int32 value y to an int8 before assigning it to the x variable.

    Here's how you can do it:

     goCopy codeint32 y = 8;
     int8 x = int8(y); // Explicitly cast y to int8
    
     // Now x has the value 8, but it is stored as an int8
    

    In this updated code, the int32 value y is cast to an int8 using the int8() typecast function, and the result is stored in the int8 variable x. Now x has the value of 8, but it is stored as an int8.

  2. We can add a uint8 with a uint32 in Solidity. Solidity is a strongly typed language, which means that the data types of the operands in an expression must be compatible. When adding two integers of different sizes, the result will be promoted to the larger data type.

    In the case of adding a uint8 with a uint32, the result will be a uint32. For example:

     lessCopy codeuint8 a = 10;
     uint32 b = 100;
    
     uint32 c = a + b; // c is now 110
    

    In this example, the uint8 value a is added to the uint32 value b, and the result is stored in the uint32 variable c. The uint8 value a is promoted to a uint32 before the addition takes place, and the result is a uint32.

    It's important to note that when adding variables of different sizes, there is a risk of overflow if the result is larger than the maximum value that can be stored in the larger data type. Therefore, it's important to always check for overflow and handle it appropriately in your Solidity code.

  3. In Solidity, when you perform an operation between a uint256 and a uint8, the result will automatically be promoted to a uint256.

    In the expression count/uint8(60), the uint8(60) is explicitly cast to a uint8 type, and then the division operation is performed between count, which is a uint256, and uint8(60). The result of this operation will be automatically promoted to a uint256 since uint256 is a larger data type than uint8.

    Therefore, the result of count/uint8(60) will be a uint256 value.

More from this blog