簡體   English   中英

將正負號整數轉換為無符號(反之亦然)

[英]Type punning a positive signed integer into an unsigned (and vice versa)

union   Positive_Small {
    int8_t  s;
    uint8_t u;
};

union Positive_Small    x = {.s = 3};
union Positive_Small    y = {.u = 4};

assert(x.u == 3);
assert(y.s == 4);

這是定義的行為嗎? 標准是否保證有符號整數類型的正范圍與無符號整數類型的正范圍具有相同的表示形式?

我認為沒有瘋狂的實現方式(也許是DS9K?)不這樣做,但是它定義了嗎?

簡而言之,是的-該標准保證對於共享的正值范圍,無符號類型的值的按位表示與帶符號類型的相同。

C11 第6.2.5節“類型”對此進行了定義(以及許多其他術語和行為):

¶6對於每種有符號整數類型,都有一個對應的(但不同的)無符號整數類型(用關鍵字unsigned指定)使用相同的存儲量(包括符號信息)並且具有相同的對齊要求。 _Bool類型和與標准有符號整數類型相對應的無符號整數類型是標准無符號整數類型 與擴展的有符號整數類型相對應的無符號整數類型是擴展的無符號整數類型 標准和擴展無符號整數類型統稱為無符號整數類型 40)

¶9有符號整數類型的非負值范圍是對應的無符號整數類型的子范圍,並且每種類型中相同值的表示形式相同。 41)涉及無符號操作數的計算永遠不會溢出,因為無法用所得的無符號整數類型表示的結果的模數要比該所得的類型可以表示的最大值大一模。

40)因此,本標准中有關無符號整數類型的任何聲明也適用於擴展的無符號整數類型。

41)相同的表示形式和對齊要求旨在表示與函數的參數,函數的返回值以及並集的成員具有互換性。

正如dbush所 指出的第6.2.6節“類型的表示形式”第6.2.6.2節“整數類型”也特別包含相關信息:

¶2對於有符號整數類型,對象表示的位應分為三組:值位,填充位和符號位。 不需要任何填充位; signed char不得有任何填充位。 恰好有一個符號位。 每個比特是一個值比特必須具有相同的值作為在對應的無符號類型的對象表示相同的位(如果有在無符號類型,則M≤n中的簽名型和N M值為比特)。 如果符號位為零,則它將不影響結果值。 如果符號位為1,則應通過以下方式之一修改值:

  • 取反符號位0的對應值( 符號和幅度 );
  • 符號位的值是-(2 M )( 二進制補碼 );
  • 符號位的值為-(2 M -1)( 一個補碼 )。

其中哪一個是實現定義的,標志位為1且所有值位為零的值(對於前兩個)還是標志位且所有值位為1(位的補碼)是陷阱表示?或正常值。 對於正負號和大小以及“ 1”的補碼,如果此表示形式是正常值,則稱為負零

暫無
暫無

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

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