programing

비트 필드에 값을 할당해도 동일한 값이 반환되지 않는 이유는 무엇입니까?

goodcopy 2022. 7. 12. 21:56
반응형

비트 필드에 값을 할당해도 동일한 값이 반환되지 않는 이유는 무엇입니까?

이 Quora 게시물에서 아래 코드를 보았습니다.

#include <stdio.h>

struct mystruct { int enabled:1; };
int main()
{
  struct mystruct s;
  s.enabled = 1;
  if(s.enabled == 1)
    printf("Is enabled\n"); // --> we think this to be printed
  else
    printf("Is disabled !!\n");
}

C++ 모두, 코드의 출력은 예기치 않습니다.

디세이블!!

그 투고에는 「사인 비트」에 관한 설명이 있습니다만, 무엇인가를 설정해 놓고, 그대로 반영하지 않는 것이 어떻게 가능한 것인지 이해할 수 없습니다.

누가 좀 더 자세히 설명해 주시겠어요?


주의: 태그 c++는 모두 필요합니다.비트필드를 기술하는 기준이 약간 다르기 때문입니다.C 사양 및 C++ 사양대한 답변을 참조하십시오.

비트필드는 표준으로 정의되어 있지 않습니다. 「 」가 지정되면, 「」가 됩니다.struct mystruct {int enabled:1;};그럼 알 수 없습니다.

  • 패딩 비트/바이트가 있는 경우 및 메모리 내의 위치.
  • 비트가 메모리에 있는 위치.정의되어 있지 않고, 엔디안리스에 의해서도 다릅니다.
  • ''의 int:n비트필드 부호

마지막 부분에 대해 C17 6.7.2.1/10에는 다음과 같이 기술되어 있습니다.

비트필드는 지정된 비트수로 이루어진 부호 있는 정수형 또는 부호 없는 정수형으로 해석됩니다.

위의 내용을 설명하는 비규격 주:

125) 위의 6.7.2에서 지정한 바와 같이 사용되는 실제 유형 지정자가int "typedef-name"으로 을 사용합니다.int다음으로 비트필드가 서명되어 있는지, 서명되어 있지 않은지가 실장 정의됩니다.

가 트필음음 음음음음음으로 signed int 수 있습니다.1데이터 저장공간은 없습니다.기호 비트만 사용할 수 있습니다.따라서 일부 컴파일러에서 프로그램이 이상한 결과를 나타낼 수 있습니다.

베스트 프랙티스:

  • 비트필드는 어떤 목적으로도 사용하지 마십시오.
  • 있는 기호는 하지 않도록 합니다.int모든 형식의 비트 조작에 사용할 수 있습니다.

저는 이해할 수 없습니다만, 어떻게 설정해 놓고 그대로 표시되지 않는 것입니까.

컴파일된 이유와 오류가 발생하는 이유를 묻는 건가요?

가 날 .컴파일러의 경고를 사용하면 문제가 발생합니다. 、 GCC g 、-Werror -Wall -pedantic:

main.cpp: In function 'int main()':
main.cpp:7:15: error: overflow in conversion from 'int' to 'signed char:1' 
changes value from '1' to '-1' [-Werror=overflow]
   s.enabled = 1;
           ^

왜 이것이 구현 정의와 오류에 맡겨지는지에 대한 이유는 과거의 사용법과 더 관련이 있을 수 있습니다. 여기서 캐스팅을 요구하는 것은 오래된 코드를 깨는 것을 의미합니다.이 표준의 저자들은 경고가 관련자들의 공백을 메우기에 충분했다고 생각할 수 있다.

규범주의를 도입하기 위해 @Lundin의 "비트필드를 어떤 목적으로도 사용하지 마십시오."라는 문구를 반영합니다.처음에 비트필드가 필요하다고 생각될 정도로 메모리 레이아웃의 상세 내용을 상세하게 파악해야 하는 타당한 이유가 있다면, 그 외의 관련 요건은 그 사양 미달과 거의 일치합니다.

(TL;DR - 비트필드가 합법적으로 "필요"할 정도로 정교하다면 비트필드가 충분히 정의되지 않은 것입니다.)

이것은 구현 정의 동작입니다.하고 있는 의 보완 를 사용하고 , 그것을 취급하고 .int이 경우 if 문의 참 부분인 경우 입력하지 않는 이유를 설명하는 부호 있는 정수로 표시됩니다.

struct mystruct { int enabled:1; };

enable1번으로 하다서명되어 있기 때문에 유효한 값은 다음과 같습니다.-1 ★★★★★★★★★★★★★★★★★」0. 를 .로 1 to 」(비트가 오버플로우)로 되돌아가다-1되지 않은입니다)

으로 부호 때은 """입니다.2^(bits - 1) - 1, 「」입니다.0★★★★★★★★★★★★★★★★★★,

2의 보계에서는 맨 왼쪽의 비트가 부호 비트라고 생각할 수 있습니다.따라서 맨 왼쪽의 비트가 설정된 부호 있는 정수는 음의 값이 됩니다.

1비트 부호 있는 정수가 있는 경우 부호 비트만 있습니다. " " "를 할당한다.1부호 비트만 설정할 수 있습니다.그래서 다시 읽을 때 값은 음으로 해석되고 -1도 음으로 해석됩니다.

있는 수 은 1비트 부호 있는 정수입니다.-2^(n-1)= -2^(1-1)= -2^0= -1 ★★★★★★★★★★★★★★★★★」2^n-1= 2^1-1=0

C++ 규격 n4713에 따라 매우 유사한 코드 스니펫이 제공된다.사용하는 타입은BOOL(커스텀) 단, 모든 유형에 적용할 수 있습니다.

12.2.4

4 true 또는 false 값이 비트필드에 저장되어 있는 경우bool의 '1비트필드bool비트 필드의 값과 값이 같아야 합니다.열거자 값이 동일한 열거형 비트필드에 저장되고 비트필드 내의 비트 수가 해당 열거형(10.2)의 모든 값을 유지할 수 있을 만큼 충분히경우 원래 열거자 값과 비트필드 값이 같아야 합니다.[예:

enum BOOL { FALSE=0, TRUE=1 };
struct A {
  BOOL b:1;
};
A a;
void f() {
  a.b = TRUE;
  if (a.b == TRUE)    // yields true
    { /* ... */ }
}

: end 예시]


언뜻 보면 굵은 글씨로 해석할 수 있는 부분이 열려 있는 것처럼 보입니다.이 말이 , 이 말이 , 이 말이 , 이 말이 맞다, 이 말이 맞다, 이 말이 , 이 말이 말이 됩니다.enum BOOL은 ''에서 유래한 말입니다.int.

enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
  struct mystruct s;
  s.enabled = TRUE;
  if(s.enabled == TRUE)
    printf("Is enabled\n"); // --> we think this to be printed
  else
    printf("Is disabled !!\n");
}

경고를 .-Wall -pedantic:

'는 너무 ' BOOL'의 모든 을 유지할 수 .struct mystruct { BOOL enabled:1; };

출력은 다음과 같습니다.

★★★★★★★★★★★★★★★★enum BOOL : int)

ifenum BOOL : int하게 enum BOOL출력은 위의 표준 패시지가 지정한 대로입니다.

(「」(「」)를 사용하고 경우enum BOOL)


따라서 이 타입은 다른 몇 가지 답변과 달리 단일 비트필드에 값 "1"을 저장할 있을 만큼 크지 않다는 결론을 내릴 수 있습니다.

제가 볼 수 있는 비트필드에 대한 당신의 이해에는 아무런 문제가 없습니다.처음에 mystruct { int enabled : 1 ; } 으로 mystruct를 재정의하고 다음으로 structure mystructs로 정의했습니다.코드화할 필요가 있는 것은, 다음과 같습니다.

#include <stdio.h>

struct mystruct { int enabled:1; };
int main()
{
    mystruct s; <-- Get rid of "struct" type declaration
    s.enabled = 1;
    if(s.enabled == 1)
        printf("Is enabled\n"); // --> we think this to be printed
    else
        printf("Is disabled !!\n");
}

언급URL : https://stackoverflow.com/questions/53853540/why-is-assigning-a-value-to-a-bit-field-not-giving-the-same-value-back

반응형