2017-04-26 55 views
0

我正在使用Ingenico的EDC終端。下面的代碼是以前的實現中存在的。在調試過程中,我遇到了一些我很難理解的代碼塊。當案件號碼前加0時,開關箱如何工作?

short bankPEM = 0; 
//bankPEM = 41; //Chip 
bankPEM = 17; //Swipe 
//bankPEM = 801; //Fallback 

switch(bankPEM) 
{ 
    case 021: cout<<"021"; break; //Swipe 
    case 051: cout<<"051"; break; //Chip 
    case 801: cout<<"801"; break; //Fallback 
    default: cout<<"Default"; break; 
} 

bankPEM是一個短變量。我發現下面的觀察行爲:

  1. 當它包含41時,case 051被執行。
  2. 當它包含17時,執行case 021
  3. 當它包含801時,執行case 801

我預想的代碼執行default案例數1 & 2. 誰能告訴在這種情況下,一些光。

我也將代碼轉換爲彙編語言。調試彙編代碼後,我將分享我的理解。

在此先感謝。

+3

[Octal literal](http://en.cppreference.com/w/cpp/language/integer_literal) – InternetAussie

+1

它是八進制的...... – LPs

+1

我已經移除了問題的程序集標記, ,與裝配無關。如果需要,您可以稍後重新添加它。請記住,程序集標籤總是帶有特定的體系結構標籤(例如,x86-64,arm,mips,...) –

回答

5

參照c standard

6.4.4.1整數值常量

十進制常量始於一個非零數字和由小數 數字序列。 一個八進制常量由前綴0組成,可選地後跟一個 數字0至7的序列。十六進制常量由前綴0x或0X組成,後跟 ,由十進制數字序列和字母a(或A)至f(或F)分別代表值爲 10至15。

重點煤礦

如圖所示的代碼似乎/是你也可以參考c++14

2.13.2整數文字

一個整數文字是沒有周期或指數部分的數字序列,可選分隔單個數字 在確定其價值時被忽略的引號。整數字面量可以有一個前綴,用於指定其基址 和指定其類型的後綴。數字序列的詞彙第一位是最重要的。 二進制整數字面量(基數2)以0b或0B開頭,由二進制數字序列組成。 八進制 整數字面量(基數八)以數字0開頭,由一系列八進制數字組成。十進制 整數字面量(基數十)以0以外的數字開頭,由一串十進制數字組成。A 十六進制整數立即數(基數爲16)以0x或0X開頭,由十六進制數字 組成,其中包括十進制數字和字母a至f以及A至F,十進制數字爲 十至十五。 [例如:數字12可以寫成12,014,0XC或0b1100。文字 1048576,1'048'576,0X100000,0x10'0000和0'004'000'000都具有相同的值。 - 端示例]

重點礦山

3

這兩個號碼021051被寫入octal form。如果將它們轉換成十進制形式,你會得到:

21 (base 8) = 1 * 8^0 + 2 * 8^1 = 1 + 16 = 17 (base 10) 
51 (base 8) = 1 * 8^0 + 5 * 8^2 = 1 + 40 = 41 (base 10) 

所以,我覺得你現在看到的時候bankPEM是17,執行case 021爲什麼當它是41,執行case 051

我不明白爲什麼執行代碼的人決定寫這樣的開關盒(它甚至不是一致的,因爲第三個盒子有一個基數爲10的數字)。

1

問題在0之前的情況下使得編譯器認爲它是八進制數021因此17 base 10 = 21 base 8因此執行case 021:41 base 10 = 51 base 8。

short bankPEM = 0; 
//bankPEM = 41; //Chip 
bankPEM = 17; //Swipe 
//bankPEM = 801; //Fallback 



switch (bankPEM) { 
    case 021: cout << bankPEM << " " << 021; 

     break; //Swipe 
    case 051: cout << bankPEM << " " << 051; 
     break; //Chip 
    case 801: cout << "801"; 
     break; //Fallback 
    default: cout << "Default"; 
     break; 
} 

我希望這有助於。