2012-04-05 80 views
1

试图了解此代码段的数学。提供总是8位数的令牌。它输入一个类型为long的类。令牌被分解成单独的字节以通过流发送。双重类型铸造令牌

long token = 85838276; 

byte cp[] = { 
      1, 0, 0, 0, 0 
      }; 

cp[4] = (byte)(int)token; // not sure what would become of token 
cp[3] = (byte)(int)(token >> 8); 
cp[2] = (byte)(int)(token >> 16); 
cp[1] = (byte)(int)(token >> 24); 

我理解类型转换(字节)部分,但没有(字节)(int)在一起。长型的令牌是否必须一次减少一种简单类型?你能不能省略(int)并得到相同的结果?

为了清晰起见,命令是重要的还是仅从cp [4]写入cp [1]。 我意识到cp [4]中的标记不会等于原始值,因为字节类型可容纳的最大值是127.是否有可能在原始标记到达目的地后重新创建它?

最后我想在php中重新创建这个。我知道一个字符串已经是一个字节流。每个字符发送将是一个字节。我需要发送一个字符串,每个字符都等于它所表示的整数值。比如一个41

更新: 所以根据Louis Wasserman的回答,当类型转换为字节时,只保留最后一个字节。

Token in binary: 101000111011100100111000100 // cp[4] = 11000100 

Token shifted 08: 1010001110111001001 // cp[3] = 11001001 

Token shifted 16: 10100011101 // cp[2] = 00011101 

Token shifted 24: 101 // cp[1] = 101 

回答

3

据我所知,(byte) (int)相当于(byte)在这方面。

对于所有双重演员来说都不是这样,但在这里看起来确实如此。他们都在“缩小”投射转换。

+0

那么当你输入一个大于该类型所允许的最大值的数字时会发生什么? – jmm 2012-04-05 18:24:44

+0

对于整数类型,它得到_truncated_:所以'(int)longValue'只需要'longValue'的最后四个字节,'(byte)intValue'接受'intValue'的最后一个字节。所以'(byte)(int)longValue'只是'longValue'的最后一个字节。 – 2012-04-05 18:29:31