2010-10-19 58 views
5

在VB6中,強制True爲整數產生值-1。爲什麼-1在VB6中將True強制爲一個整數?

這是爲什麼?這背後的推理是什麼?

在大多數其他編程語言(C/C++,Java,Perl,Python等)中,當強制爲一個整數時,true變爲1。在布爾代數中,值1用於表示真/開。爲什麼VB6的做法不同?

我確實看到一個按位不是-1(真)將產生0(假),反之亦然(因爲-1的表示在two's complement中全爲1)的事實中有一定的優雅對稱性,但我想不出這個身份的任何實際好處。

順便說一下,我只是出於好奇而問 - 當我第一次學習VB6時,這讓我感到奇怪,從此我一直在想。

回答

7

你已經非常接近的原因...埃裏克利珀reveals the horrible, horrible truth

這是怎麼回事是VBScript是不符合邏輯的。 VBScript是按位。所有所謂的邏輯運算符都用於數字,而不是布爾值!不是,或者,XOr,Eqv和Imp都將它們的參數轉換爲四字節整數,對整數中的每對比特進行邏輯運算,並返回結果。如果True爲-1且False爲0,則所有事情都會消失,因爲-1的所有位都打開,0的所有位都關閉。

(如Chris Smith notes,這一直是很長一段時間基本的各種口味的真...)

注意,在VB.NET,邏輯運算符(即,操作只有運營商在布爾數據類型上)被引入,但是現有的運算符仍然會很高興地執行按位操作,如果是饋給整型的話。當我在C++和VB之間移動時,這一直是我經常感到沮喪的原因...

+0

我知道:)我不喜歡VB;) – Onkelborg 2010-10-20 00:09:21

+0

有趣!感謝您的鏈接。我知道邏輯運算符沒有短路,並且對整數值按位進行操作,但是我沒有意識到它們是按位進行的,即使對於布爾值也是如此。和@Onkelborg,我也不喜歡VB,我只是好奇這個異常;-) – Cameron 2010-10-20 00:57:02

+1

好:)對人類的希望:)對於人類的希望:) – Onkelborg 2010-10-20 00:58:39

2

真正被表示爲唯一的二進制一(11111111等),虛假因爲只有零(00000等)

數據類型INT簽署,這意味着最高位時零告訴我們該值積極的,當它是負面的。嘗試將最大的可能的正數溢出一個,然後將其「翻轉」到可能的最大負數。

十進制-1表示爲只有一個。你有它:)

4

這是在微軟基本很長一段時間,至少GW-BASIC真實。我認爲這是因爲在那些日子裏沒有實際的布爾類型或單獨的邏輯NOT運算符,所以爲了使整數NOT運算符同時使用true和false,它們使用值0和-1。正1不會工作,因爲不是1不是零。

相關問題