[英]Typecasting a negative number to positive in C
我不希望打印出的值是初始負值。 我是否需要進行類型轉換?
#include<stdint.h>
int main() {
int32_t color = -2451337;
uint32_t color2 = (uint32_t)color;
printf("%d", (uint32_t)color2);
return 0;
}
您花了一堆(以簽名值存儲)。 然后,您告訴CPU將這些位解釋為無符號。 然后,您告訴CPU渲染與再次簽名相同的位(%d)。 因此,您將看到與您第一次輸入的相同的內容。
C只是處理成堆的位。 如果您選擇的值接近所涉及類型的表示極限(在二進制補碼表示中讀取),那么我們可能會看到一些時髦的效果,但您碰巧選擇的值卻沒有。 這樣您就可以收回您的投入。
int32_t color = -2451337;
uint32_t color2 = (uint32_t)color;
強制轉換是不必要的; 如果您省略它,則將隱式完成完全相同的轉換。
對於兩種數值類型之間的任何轉換,如果值在兩種類型中均可表示,則轉換將保留該值。 但是由於color
是負數,因此情況並非如此。
對於從有符號整數類型到無符號整數類型的轉換,結果是實現定義的 (或者它可以引發實現定義的信號,但是我不知道執行此操作的任何編譯器)。
在大多數編譯器中,相同大小的整數類型之間的轉換只是復制或重新解釋組成表示形式的位。 該標准要求int32_t
使用二進制補碼表示形式,因此, 如果轉換僅復制位,則結果將為4292515959
。
(C標准允許其他結果,但實際編譯器不太可能實現。該標准允許帶符號的整數類型使用“ 1”的補碼和符號及大小表示,但具體要求int32_t
使用“ 2”的補碼; a用於補碼CPU的C編譯器可能只是不定義int32_t
。)
printf("%d", (uint32_t)color2);
同樣,由於color2
已經是uint32_t
類型,因此不需要進行color2
類型轉換。 但是"%d"
格式需要一個類型為int
的參數,該參數是一個帶符號的類型(可能窄至16位)。 在這種情況下, uint32_t
值不會轉換為int
。 最有可能的表示color2
將被視為好像它是一個int
對象,但行為是不確定的,所以只要C標准是毫不誇張地關注任何事情都可能發生。
要打印uint32_t
值,可以使用<inttypes.h>
定義的PRId32
宏:
printf("%" PRId32, color32);
或者,也許更簡單地說,您可以將其轉換為最大的無符號整數類型,並使用"%ju"
:
printf("%ju", (uintmax_t)color32);
這將打印實現定義的值(可能是4292515959
)的color32
。
並且您應該在格式字符串中添加換行符\\n
。
更多問題:
您缺少了#include <stdio.h>
,如果您調用printf
,這是必需的。
int main()
可以,但首選int main(void)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.