![](/img/trans.png)
[英]Is there a simple way to convert a signed char to an int without sign extension?
[英]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位。 。
還有movswl
和movswq
分別將16位寄存器擴展為32位和64位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.