簡體   English   中英

從簽名char到sign int的符號擴展如何工作?

[英]How does sign extension from signed char to sign int works?

為什么用帶符號的char表示的255值會被整數轉換為-1 我看到x86正在使用mov sbl指令將帶符號的char轉換為帶符號的int ,但是為什么它以現在的方式轉換呢?

假設一個8位char,一個帶signed char類型的對象永遠不會有一個值255。當您給這樣的對象分配255時,它將以實現定義的方式轉換(實際上,總是將256模減少為范圍)。 因此,此時它已經具有值-1。 將其轉換為int類型根本沒有任何改變。

符號擴展通過檢查值的高位並從那里擴展來起作用。 255是全1的無符號,因此當對其進行符號擴展時,將填充1。 所有1的有符號整數格式均為-1。

我注意到您說255為帶符號字符。 簽名char的最大值實際上是127。

char a = 255;

在某些編譯器中,您實際上會得到-1。 無符號字符可以容納255。

指令movsb{w,l,q}查看字節中的“最高位”,並用該值填充字的其余位(16、32或64位)。

對此的姐妹指令是movzb{w,l,q} ,該零擴展為零(即執行“無符號擴展”)。

在64位x86中,32位操作會自動對高32位進行零填充,因此要將32位值擴展為64位,編譯器將添加movslq將32位數字擴展為64位。 。

還有movswlmovswq分別將16位寄存器擴展為32位和64位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM