簡體   English   中英

C中的二進制補碼

[英]Two's complement in C

讓我們假設一個16位變量(a)存儲為無符號16位。 如果我使用帶符號的16位數字,可以說我將帶符號的數字(b)讀為二進制補碼格式嗎?

uint16_t a = 0xFFF1;
int16_t b;
b = (int16_t)a;

幾乎 所有常見的體系結構都應該是二進制補碼,並且將等寬度的無符號到符號轉換基​​本上視為無操作。

理論上並不總是如此 C標准說,如果值適合( 6.3.1.3p1 ),則轉換為非_Bool類型的值不會更改值;否則,對於無符號到符號的轉換,您可以實現實現定義的轉換,也可以發出信號( 6.3。 1.3p3 )。

6.3.1.3有符號和無符號整數

1將整數類型的值轉換為_Bool以外的其他整數類型時,如果該值可以用新類型表示,則該值不變。

2否則,如果新類型是無符號的,則通過重復添加或減去新類型所能表示的最大值之前的值,直到該值在新類型的范圍內,來轉換該值。60)

3否則,新類型已簽名且值無法在其中表示; 結果是實現定義的,還是引發實現定義的信號。

(通過比較0( 6.3.1.2p1 )來完成_Bool的轉換。如果源適合(0或1),也沒有任何變化,但是所有非零數字都轉換為(_Bool)1 ,而環繞規則( 6.3。 1.3p2 ),那么偶數將轉換為(_Bool)0 ,但不會。)

正如詹斯·古斯特(Jens Gustedt )在評論中指出的那樣, C2x應該刪除特殊情況,因此實際上是應該始終是

暫無
暫無

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

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