回答
事情是這樣的:
IL_0001: /* 1F | 32 */ ldc.i4.s 50
IL_0003: /* 0B | */ stloc.1
IL_0004: /* 07 | */ ldloc.1
IL_0005: /* 0A | */ stloc.0
在一個較低的水平,這取決於機器架構和優化水平。這樣的代碼特別的,沒有效果,可能完全被省略。否則,這將是簡單的代碼,或許是這樣的:
movsx eax, word ptr [ebp+12]
mov [ebp+8], eax
movsx
是x86指令它保存在它被裝載到一個更大的目標更短的數字的符號;基本上,它會查看較小數據源的最重要位,並在擴展數字時將其複製到其餘位中。
從反射器:
.method public hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] int32 num,
[1] int16 num2)
L_0000: nop
L_0001: ldc.i4.0 ; Load the constant 0
L_0002: stloc.0 ; Store the value into local var 0
L_0003: ldc.i4.s 50 ; Load the constant 50 - notice it treats it as a 32-bit value
L_0005: stloc.1 ; Store the value into local var 1
L_0006: ldloc.1 ; Load local var 1
L_0007: stloc.0 ; Store the value into local var 0
L_0008: ret
}
在IL級,沒有什麼特別發生在分配,但是請注意ldc.i4.s 50
對待字面值作爲一個4字節(32位)整數。
當代碼編譯爲JIT時,生成的彙編代碼可能只是將值50提升爲32位寬的值。
評估堆棧沒有小於32位的表示。 [編輯,大多數個案(感謝您對評論的更新:)]直到您實際存儲除堆棧以外的某個16位值,沒有任何特殊情況發生,因爲short
和int
的大小相同。這裏是唯一的操作,其中,你會看到一個區別:
b = (short)a
會結果的16位符號擴展到一個完整的32位寬的變量。這是評論中提到的conv.i4
指令。*(short*)c = b
或分配到該結構被標記StructLayout.Explicit
或具有結構構件的襯墊小於4
只會寫入其32位表示的低16位。checked { b = (short)a; }
如果(a < -32768 || a > 32767)
會拋出異常。
直到存儲除堆棧以外的其他內容都沒有效果。類型轉換Int32到Int16將導致堆棧上的值被截斷,例如, conv.i2。 – 2009-08-27 06:56:36
@巴里:謝謝。我在列表中發現了它,但是我忘記了在發佈之前更新了介紹段落。 :) – 2009-08-27 16:50:37
- 1. 當Null設置爲NSString時會發生什麼?
- 2. 當我爲HttpClient對象設置代理時會發生什麼?
- 3. 當我們創建System.DirectoryServices.DirectoryEntry實例時,幕後會發生什麼?
- 4. Java:openGL:JOGL:當我調用display()方法時,幕後會發生什麼?
- 5. 當我回顯變量時,幕後會發生什麼?
- 6. 當我運行bundle exec黃瓜時,幕後會發生什麼?
- 7. 當您在關閉body標籤後放置javascript時會發生什麼?
- 8. Int16,Int32和Int64有什麼區別?
- 9. 會發生什麼,當我們設置XMX和X毫秒等於大小
- 10. 當您產生activerecord對象時會發生什麼?
- 11. 當我將getFileName()的第二個參數設置爲false時會發生什麼?
- 12. 當我設置._visible場景背後會發生什麼=假
- 13. Swift:將Int16轉換爲Int32(或NSInteger)
- 14. 如果cookie時間設置爲零,會話會發生什麼?
- 15. 當您在返回之前等待任務時會發生什麼?
- 16. 當枚舉未設置時會發生什麼?
- 17. 當調用glUniform4f來設置float3變量時會發生什麼?
- 18. 爲什麼從Int16變量Int32中減去Int16參數的結果?
- 19. ,當您分配多個虛擬內核時會發生什麼?
- 20. 當您不在Flash中嵌入字體時會發生什麼?
- 21. 當您加入「或」或SQL時會發生什麼?
- 22. 當您返回View時應該是PartialView會發生什麼?
- 23. 當CreateWaitableTimer設置爲不存在的日期/時間時會發生什麼?
- 24. 幕後發生了什麼?
- 25. 當您將併發設置爲false時Quartz觸發器「堆積」
- 26. 當你設置PINx時,會發生什麼?爲什麼它有時會起作用?
- 27. 轉換爲int16,int32,int64 - 您如何知道選擇哪一個?
- 28. 爲什麼Int16.CompareTo從Int32返回不同的結果.CompareTo
- 29. 當PictureBox.Visible設置爲True時,C#中究竟發生了什麼?
- 30. 當我將uint8_t數組轉換爲uint32_t時會發生什麼?
嘿嘿......這真的很低級......我在想一個縮小轉換的路線...... blah ...... blah ...... blah .... :) – klabranche 2009-08-27 05:43:20
很有意思,我曾與摩托羅拉大會合作過,但已經有一段時間了。謝謝。 – ChaosPandion 2009-08-27 05:46:43
您提供的代碼中不需要縮小轉換; 50是靜態已知適合範圍,並且任務擴大,而不是縮小。爲了明確縮小,可以使用'conv。[type]'IL。 'conv.i2'將堆棧頂端截斷爲Int16。在x86彙編中,根據它的使用方式,可能不需要轉換,或者可能會應用'和0xffff'等。 – 2009-08-27 05:49:20