2014-11-10 3 views
0

구조체 내부에서 int16_t 변수를 나누려고합니다. 이 구조는 디스크에 유지되고 다시 부팅 할 때 다시로드됩니다. 이전 구조 나 변경된 새로운 하나구조체에서 변수를 나누기

struct details 
{ 
    int a; 
    int16_t var1:15; 
    unit16_t var2:1; 
    int16_t b; 
}details_t; 

새로운 변화 reboot.But 걸쳐 미세하고이 올바른 방식으로되어 작업이다

struct details 
{ 
    int a; 
    int16_t var1; 
    int16_t b; 
} details_t 

이다? 내가 무엇을 달성하고자하는 는 VAR2을 설정하거나 지워집니다에 따라 변수 VAR1의 이중 의미를 가지고있다. 부터 var2은 이진 값을 저장하기 때문에 uint16_t로 선언했습니다. 변수를 분리하고 두 개의 다른 데이터 유형 (int16_t 및 uint16_t)으로 선언하는 것이 합법적입니까? 이것은 업데이트 후에도 원활하게 작동해야하는 기존 스택의 업데이트가 될 것입니다. 또한이 parted 변수에 set_bit 및 clear_bit 같은 커널 함수를 사용할 수 없습니다. var1var2. 내 컴퓨터가 리틀 엔디안입니다

답변

0

하위 호환성을 유지하려고합니다. 그러나 불행하게도 C 표준은 구현이 비트 필드를 처리하는 방법에 대한 많은 공간을 제공합니다. var1var2은 결국 2 개의 16 비트 변수로 끝날 수 있습니다.

대신 수동 비트 마스킹 및 이동을 사용하는 것이 좋습니다. 비트 시프트를 사용할 때 부호있는 변수에주의하십시오. 필요한 경우 부호없는 임시 변수를 사용하십시오.

0

하지만 올바른 방법입니까?

비트 필드는 휴대 성이 요구되는 경우 특히, 거의 확실 아무것도을하는 잘못된 방법이다. Please read this.

int16_t var1:15;이 표준에 의해 지정되어 있지 않다고 선언하면, 부호 비트가 끝나는 곳, msb가 갈 곳 또는 다른 것을 알려주지 않습니다. 이 비트 필드가 부호가 있거나 부호가없는 것으로 취급 될지 여부는 지정되지 않습니다.

은 법적 변수를 분리하고 두 개의 서로 다른 데이터 타입

그것은 컴파일하지만 결과는 시스템과 컴파일러에 따라 달라집니다로 선언하는 것입니다. 기본적으로 당신은 임의의 특정 컴파일러 문서가 달리 말하지 않는 한 임의의 주어진 행동을 예측할 수없는 16 비트의 임의의 끈을 만들었습니다.

업데이트 후 원활하게 작동해야하는 기존 스택의 업데이트가 될 것입니다.

그런 다음하지 마십시오. 프로그램을 중단 시키거나 향후 유지 보수를위한 취약성을 적어도 도입 할 가능성이 있습니다. 대신 비트 필드라는 것을 보았고 비트 단위 연산자를 사용하여 원래 int16_t을 조작 한 것을 잊지 마십시오.

이 데이터 형식의 중간에있는 부울 플래그로 밀입국하는 것이 어떤 의미인지는 모르지만 처리 할 프로그램에 달려 있습니다.

+0

var1에서 최대 10 비트가 필요하므로 비트 단위의 연산자를 사용하여 처리 할 수 ​​있습니다. 나머지 비트는 사물을 처리하는 데 사용할 수 있습니다. 자세한 내용 주셔서 감사합니다. 나중에 실수하는 것을 피하는 데 많은 도움이됩니다. –

+0

@VigneshKViki 이상한 점은이 변수를 부호로 선언했다는 것입니다. 실제로 2의 보수로 서명 된 변수 인 경우 16 비트를 모두 사용합니다. 서명 된 변수가 아닌 경우 서명 된 유형을 사용하는 이유는 무엇입니까? 작업에 적합한 유형을 선택하는 것은 C에서 매우 중요합니다. – Lundin

+0

예. var1을 -1로 설정하여 유효하지 않은 것으로 표시합니다. 따라서 서명 된 유형이 필요합니다. –

관련 문제