SORU
7 Temmuz 2015, Salı


64-bit BOOL iOS

32-bit BOOL kullandığım zaman alıyorum:

BOOL b1=8960; //b1 == NO

bool b2=8960; //b2 == true  

Ama 64-bit için:

BOOL b1=8960; //b1 == YES

bool b2=8960; //b2 == true

64-bit 32-bit BOOL hakkında neler değişti?

CEVAP
7 Temmuz 2015, Salı


@TimBodeit haklı, ama açıklamıyor ...

BOOL b1=8960; //b1 == NO

12* *64-bit iOS. olarak değerlendirilir neden ... 32-bit iOS NO değerlendirir ve Aynı baştan başlayalım.

ObjC BOOL tanımı

#if (TARGET_OS_IPHONE && __LP64__)  ||  (__ARM_ARCH_7K__ >= 2)
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

64-bit iOS veya ARMv7k (izle) signed char sonuna bool olarak tanımlanmış.

EVET ve HAYIR . ObjC BOOL

Okuma bulabileceğiniz Objective-C Literals,:

Daha önce, sadece signed char için bir typedef oldu BOOL türü ve YES NO (BOOL)1 (BOOL)0genişletmek makrolar edildi sırasıyla. @YES @NO ifadeleri destekleyen, bu makrolar şimdi yeni bir dil kullanarak tanımlanmış <objc/objc.h> anahtar kelimeler:

#if __has_feature(objc_bool)
#define YES __objc_yes
#define NO  __objc_no
#else
#define YES ((BOOL)1)
#define NO  ((BOOL)0)
#endif

Derleyici örtük olarak __objc_yes (BOOL)1 27 *dönüştürür 29**. Anahtar BOOL ve tamsayı belirsizliği ortadan kaldırmak için kullanılır hazır.

bool tanımı

bool makro stdbool.h tanımlanmış ve bir boolean türü c99'da tanıtıldı _Bool, genişliyor. İki değer saklayabilirsiniz, 0 1. Başka bir şey yok. Daha hassas, stdbool.h olmak üzere dört makroları kullanmak için tanımlar:

/* Don't define bool, true, and false in C  , except as a GNU extension. */
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Define _Bool, bool, false, true as a GNU extension. */
#define _Bool bool
#define bool  bool
#define false false
#define true  true
#endif

#define __bool_true_false_are_defined 1

_Bool

_Bool c99'da tanıtıldı ve değerleri 0 1 tutabilir. Önemlidir:

Değeri ** 40 sonuç 0 için indirgendiğinde değer eşittir* *42 1 aksi.

Şimdi bu nereden biliyoruzkarmaşageliyor ve daha neler olduğunu anlayabiliriz.

|| ARMv7k iOS 64-bit

BOOL ->bool ->_Bool değerler 0 1()

_Bool 8960 indirgeme değeri 0 eşit değildir, çünkü 1 verir. (Bakınız_Boolbölüm).

32-bit iOS

BOOL ->signed char değerler 127 55 *().

Eğer signed char, int değerler (-128 127) saklamak için gidiyoruz değeri C99 6.3.1.3 başına değişmez. Aksi takdirdeuygulama tanımlı(C99 alıntı):

Aksi takdirde, yeni tip imzalanır ve değeri olamaz temsil sonuç, uygulama tanımlı ya; ya da bir uygulama tanımlı bir sinyal ortaya çıkar.

Çınlama karar anlamına gelir. Kısa, varsayılan ayarlar ile yapmak için gider bu(int ->sarar 62**):

  • -129 127 olur
  • -130 126 olur
  • -131 125 olur
  • ...

Ve ters yönde

  • 128 -128 olur
  • 129 -127 olur
  • 130 -126 olur
  • ...

Ama signed char aralığı -128 127 değerleri depolayabilir 0 de saklayabilirsiniz. Örneğin 256 (int) 0 (signed char) olur. 83 ** değer sarılır

  • 8960 0 olur
  • 8961 1 olur
  • 8959 -1 olur
  • ...

... signed char (8960 256, 8960 % 256 == 0 katı) içinde muhafaza 0 olur, böylece NO. Aynı 256, 512, ... 256 katları için geçerlidir.

Ben güçlü BOOL YES, NO kullanma ve if, vb bir koşulu olarak int gibi süslü C özellikleri güvenmek değil tavsiye. Swıft*,* 105 ** 104 false sebebi Bool beklenen koşulları Int değerleri kullanabilirsiniz. Bunu önlemek için sadecekarmaşa...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autocar

    Autocar

    11 Mart 2006
  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • steven johns

    steven johns

    11 Mart 2011