long byte로 변환 시프트 횟수가 음수이거나 너무 큽니다. 정의되지 않은 동작입니다.
자바클라이언트에서 시간(1970년 이후)을 long형으로 얻고 byte[8]로 바꿔서 c서버로 보내고 c서버에서 얻은값을 long으로 다시 바꾼 후 c에서도 시간을 얻어 비교하려고합니다.
자바
long time=new Date().getTime();
byte tim[]=new byte[8];
tim[0]=(byte) (time);
tim[1]=(byte) (time>>8);
tim[2]=(byte) (time>>16);
tim[3]=(byte) (time>>24);
tim[4]=(byte) (time>>32);
tim[5]=(byte) (time>>40);
tim[6]=(byte) (time>>48);
tim[7]=(byte) (time>>56);
m_sock_out_stream.write(tim);
m_sock_out_stream.flush();
서버
(byte형 p의 31~38인덱스에 들어옵니다.)
long time=(p[31]<<0)+(p[32]<<8)+(p[33]<<16)+(p[34]<<24)+(p[35]<<32)+(p[36]<<40)+(p[37]<<48)+(p[38]<<56);
long curTime=time(NULL);
printf("\n전송된 시간= %d\n현재 시간 = %d\n", timeStamp, curTime);
제가 int형 데이터를 딱 저런 방법으로 시프트해서 보내고 받고 있습니다. 그런데 long이라 뭐가 다른건지 다르게 나오네요.
int형에서는 보내줄 때 시프트 하기 전에 & 0xFF000000와 같은 연산을 하는데 long형에서는 어떻게 해야될지 모르겠습니다.
현재 결과값은
전송된 시간=-1832012775
현재 시간=1398327313
이렇게 나옵니다.
<<32부터 시프트 횟수가 음수이거나 너무 큽니다. 워닝이 나오는데 어떻게 해야 될까요?
서버 쪽에서 각각의 p[...] 앞에
서버 쪽에서 각각의 p[...] 앞에 (long)이라고 형변환 연산자를 넣어주면
경고가 안뜨겠죠.
그리고 쉬프트 연산자를 쓰시려면 unsigned 형이 더 낫지 않을까요?
signed형의 경우에는 쉬프트 시에 동작이 좀 까다롭습니다.
.
답변 감사합니다.
댓글 달기