2012-09-24 2 views
-1

만들기. BigInt는 2의 보수로 단일 정수 N 비트로 해석되어야하는 바이트 배열로 표현됩니다. 그래서 내가 좋아하는 무언가를 만들고 싶어 :bigints로 비트 시프트를 구현하려고 시도하는 큰 정수

예 배열 BIGINT : {내지 0xFE, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로, 0xFF로} 정수 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE (-2) N = 128 비트를 나타냅니다.

typedef unsigned char * BigInt; 난 내 BIGINT 메신저 점점 오류

당신은 unsigned char**new를 선언
#include <stdlib.h> 

    void bi_init (int nbits) 
    { 
     nbytes = (nbits/8); 
    } 

    BigInt bi_new (int val) 
    { 
     BigInt new = (BigInt)malloc(nbytes*sizeof(unsigned char)); 

     new=val --> problem, can someone give me a hint on how can i implement this array? 

     return novo; 
    } 
+0

어쩌면 당신은 동일한 식별자 'novo'를 일관되게 사용해야합니다. '신 '과의 혼합물에 대한 이야기? 그리고 왜 우리에게 정확한 오류 메시지를주지 않았습니까? – Jens

+0

정말로 불투명하지 않으면 포인터 타입을'typedef'하지 마십시오. 그것은 더 좋은 해를 입 힙니다. 그러지 마세요. –

답변

3
typedef unsigned char *BigInt; 

BigInt *new = (BigInt)malloc(nbytes*sizeof(unsigned char)); 

을 만들려고 할 때

, 그것은 너무 많은 포인터 (그리고 당신이 malloc의 결과를 캐스팅하지 말아야의 한 단계입니다 기음).

노보 = 브로

가 함께 단지 할당 된 주소는 novonew가 동일한 변수이고 단 하나의 발생을 포스트로 번역되었음을 덮어 가정 전달 된 val. nbits 8의 배수가 아닌 경우

int i = 0; 
// make it unsigned, so that right-shifting works correctly 
unsigned int u_val = val; 
while(u_val) { 
    new[i++] = u_val&0xFF; 
    u_val >>= 8; 
} 

은 그럼 당신은 너무 적은 메모리를 할당하고있는 문제

nbytes = (nbits/8); 

이 남아, val의 바이트 할당 된 버퍼를 채우기 , 확인하십시오

nbytes = (nbits+7)/8; 
+0

고마워 내가 그것을 시도합니다 – ymorenz