Add bytes with type casting, Java

19,277

Solution 1

close, but a little off.

ars[0] = (byte)(ars[0] + ars[4]);

keep in mind ars[0] and ars[4] are already bytes, so there is no need to cast them to bytes.

Instead, cast the result of the summation to a byte.

Solution 2

In Java, the sum of two bytes is an int. This is because, for instance, two numbers under 127 can add to a number over 127, and by default Java uses ints for almost all numbers.

To satisfy the compiler, replace the line in question with this:

ars[0] = (byte)(ars[0] + ars[4]);

Solution 3

I cam across this question a while back, and collected all the findings here : http://downwithjava.wordpress.com/2012/11/01/explanation-to-teaser-2/

We all know bytes get converted to ints during an arithmetic operation. But why does this happen? Because JVM has no arithmetic instructions defined for bytes. byte type variables have to be added by first 'numerically promoting' them to 'int' type, and then adding. Why are there no arithmetic instructions for the byte type in JVM? The JVM spec clearly says:

The Java virtual machine provides the most direct support for data of type int. This is partly in anticipation of efficient implementations of the Java virtual machine's operand stacks and local variable arrays. It is also motivated by the frequency of int data in typical programs. Other integral types have less direct support. There are no byte, char, or short versions of the store, load, or add instructions, for instance.

Solution 4

public static void main(String args[]){
    byte[] ars = {3,6,9,2,4};
    ars[0] = (byte)(ars[0] + ars[4]);
    System.out.println( ars[0] );
}

this happens for the reason that java automatically converts expressions which use byte and short variables to int... this is to avoid potential risk of overflow.... as a result even if result may be in the range of byte java promotes type of expression to int

Solution 5

Please replace that line with the following

ars[0] = (byte)(ars[0]+ars[4]);
Share:
19,277
Figitaki
Author by

Figitaki

I'm a developer and designer making things for people. Mainly working with web/mobile technologies but I've got experience with a variety of stacks.

Updated on June 04, 2022

Comments

  • Figitaki
    Figitaki almost 2 years

    I am trying to add two values in a byte array. This is my code:

    byte[] ars = {3,6,9,2,4};
    ars[0] = (byte)ars[0] + (byte)ars[4];
    System.out.println( ars[0] );
    

    I get this error on compilation:

    Main.java:9: possible loss of precision
    found   : int
    required: byte
        ars[0] = (byte)ars[0] + (byte)ars[4];
                              ^
    1 error
    

    Any help is, as always, much appreciated.

  • hansvb
    hansvb about 12 years
    It happens because 100 (a byte) + 100 (another byte) is 200, which is not a byte (in Java, where bytes are from -128 to 127). The explicit cast says that it is okay to throw away the "overflow".
  • Gokay
    Gokay over 5 years
    I do not think your answer's reasoning is valid. The sum of two ints can also be over Integer.MAX_VALUE. However, int a = Integer.MAX_VALUE + 1 does not give a compile-time error, while byte a = 1 + 1 does give a compile-time error. This is all due to the JVM's design, specified in the JVM spec section 2.11.1, details of which are too technical for many people
  • rosshjb
    rosshjb over 3 years
    See stackoverflow.com/a/18483732/9304999 . It would be more accurate and detailed answer.