문제

나는 언어를 디자인하고 있는지 결정하려고 노력하고 있습니다. true 0x01 또는 0xff 여야합니다. 분명히, 0이 아닌 모든 값은 True로 변환되지만 정확한 내부 표현을 결정하려고합니다.

각 선택에 대한 장단점은 무엇입니까?

도움이 되었습니까?

해결책

프로세서에 레지스터가 0으로 설정 될 때 설정된 플래그가 있기 때문에 0은 False입니다.

다른 플래그는 다른 값 (0x01, 0xff 등)에 설정되지 않지만 레지스터에 0이 아닌 값이있을 때 제로 플래그가 False로 설정됩니다.

따라서 여기서는 0을 거짓으로 정의하고 다른 것이 맞는 것을 옹호하는 대답은 정확합니다.

true의 기본값을 "정의"하려면 0x01이 대부분보다 낫습니다.

  • 그것은 모든 비트 길이와 서명에서 동일한 숫자를 나타냅니다.
  • 그것이 사실인지, 제로 플래그를 사용할 수 없거나 사용하는 데 드는 경우를 알고 싶을 때만 한 비트를 테스트하면됩니다.
  • 다른 유형으로 변환하는 동안 부호 확장에 대해 걱정할 필요가 없습니다.
  • 논리적 및 산술 표현은 동일하게 행동합니다

-아담

다른 팁

외부 표현의 규칙을 만족하는 한 중요하지 않습니다.

나는 여기에서 c에서 힌트를 취할 것입니다. 여기서 거짓은 절대적으로 0으로 정의되고 true는 false가 아닌 것으로 정의됩니다. 이것은 True의 절대 값과 비교할 때 중요한 차이점입니다. 두 상태 만있는 유형이 없다면 해당 값 유형의 모든 값, 참된 것 및 거짓을 설명해야합니다.

0이 아닌 값이 사실이라고 선택하는 이유는 무엇입니까? Ada에서 True는 참이고 거짓은 거짓입니다. 부울과의 암시 적 유형 변환은 없습니다.

-1을 사용하면 약하게 타이핑 된 언어로 하나의 이점이 있습니다. and 논리 대신 연산자 and 운영자, 피연산자 중 하나가 표준 부울 표현으로 변환 된 한 상태가 여전히 올바르게 평가됩니다. 표준 표현이 1이라면 이것은 사실이 아닙니다.

  0xffffffff & 0x00000010 == 0x00000010 (true)
  0xffffffff && 0x00000010 == 0xffffffff (true)

하지만

  0x00000001 & 0x00000010 == 0x00000000 (false)
  0x00000001 && 0x00000010 == 0xffffffff (true)

IMO, 당신이 고수하고 싶다면 거짓= 0x00, 0x01을 사용해야합니다. 0xff는 일반적으로 다음과 같습니다.

  • 일부 작업이 넘쳐나는 신호

또는

  • 오류 마커

그리고 두 경우 모두 아마도 의미가 있습니다 거짓. 따라서 집행품의 *닉스 리턴 값 규칙, 진실= 0x00이고 0이 아닌 값은 False입니다.

-1은 1보다 길다.

결국 0은 거짓이기 때문에 중요하지 않으며 다른 것은 사실이며, 진실의 정확한 표현과 결코 비교되지 않을 것입니다.

편집, 투표 다운 투표에 대해서는 이유를 설명하십시오. 이 답변은 본질적으로 현재 +19로 평가 된 것과 동일합니다. 그래서 그것은 동일한 기본 답변에 대한 21 표 차이입니다.

-1 댓글로 인해 사실이라면 실제로 "true"(예 : 컴파일러 작성자)를 정의하는 사람은 정확한 표현을 사용한다고 가정 할 때 1 대신 -1을 사용해야합니다. -1은 1보다 오래 걸리며 최종 결과는 동일합니다. 진술은 어리석은 일이며, 두 사람 (1 또는 -1) 사이에 실질적인 차이가 없기 때문에 어리석은 것이 었습니다.

당신이 무언가를 표시하려면 적어도 그것에 대한 이론적 근거를 제공 할 것입니다.

0xff는 8 비트가 최소 저장 장치라는 암시 적 가정을 가지고 있기 때문에 이상한 선택입니다. 그러나 부울 가치를 그보다 더 압축시키는 것은 드문 일이 아닙니다.

부울 운영자가 단 하나 또는 1 비트 (부호 확장에 관계없이 작동)를 생산하는지 또는 모든 사람 또는 All-one (서명 된 두 보상의 부호 확장에 따라 다르든 모든 길이로 모든 사람을 유지하기위한 수량).

나는 당신의 삶이 0과 1으로 더 간단하다고 생각합니다.

전문가는 없으며 단점도 없습니다. 정수에서 부울로 자동 변환을 제공하는 한 임의적이므로 선택한 숫자는 중요하지 않습니다.

반면에,이 자동 변환을 허용하지 않으면 전문가가 있습니다. 언어에 완전히 임의적 인 규칙이 없을 것입니다. 당신은 가지고 있지 않을 것입니다 (7 - 4 - 3) == false, 또는 3 * 4 + 17 == "Hello", 또는 "Hi mom!" == Complex(7, -2).

나는 c 방법이 갈 길이라고 생각한다. 0은 거짓을 의미하며 다른 것은 사실을 의미합니다. 당신이 True를 위해 다른지도를 가지고 가면, 당신은 불확실한 값을 가진 문제가 남아 있습니다.

이것이 특정 표현을 특별히 지원하는 특정 명령어 세트를 위해 컴파일 할 언어라면, 그 안내를하겠습니다. 그러나 '표준'내부 표현에 대한 추가 정보가 없으면 -1 (모두 1의 이진)로 갈 것입니다. 이 값은 원하는 크기의 부울 (단일 비트, 8 비트, 16 등)으로 잘 확장되며 "True"또는 "False"를 더 작은 "True"또는 "False"로 분해하면 여전히 그 점입니다. 똑같다. (16 비트 true = 0x0001을 깨뜨린 경우 False = 0x00과 true = 0x01을 얻을 수 있습니다).

0이 거짓이고 0이 아닌 경우 언어를 설계하십시오. 특정 값 대신 "0이 아닌"생각을 "전환"할 필요가 없습니다. 코드를 올바르게 작성하는 데 도움이됩니다.

"true"와 같은 기호가 내장되어 있다면 계속해서 값을 선택하십시오. 그러나 항상 "0x01이 true"대신 "0이 아닌 것은 true"라고 생각합니다.

당신이 무엇을 하든지, 일단 당신이 당신의 값을 선택하면 값을 바꾸지 마십시오. Forth-77에서 True와 False는 1과 0으로 정의되었습니다. 그런 다음 Forth-83은 그것들을 -1과 0으로 재정의했습니다. 이것으로 인해 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top