2011-02-26 73 views
13

我很抱歉,如果這個問題似乎很奇怪。我正在調試我的代碼,這似乎是問題,但我不確定。如何在C中將unsigned int轉換爲int?

謝謝!

+1

真正的問題是你想要做什麼當/如果unsigned int中的值超出了可以由signed int表示的範圍。如果它在範圍內,只需分配它即可完成。如果超出範圍,則會給出未指定的結果,因此您可能需要先將其縮小到正確的範圍,或將其分配給更大的帶符號類型。 – 2011-02-26 20:23:33

+0

未指定,實現定義(C996.3.1.3§3)。否則,我同意,並分配給一個更大的帶符號整數是最簡單的解決方案。 – Gauthier 2014-02-18 10:39:56

回答

23

這取決於你想要的行爲是什麼。 int不能容納unsigned int能夠的許多值。

你可以施放和往常一樣:

int signedInt = (int) myUnsigned; 

,但這樣會造成問題,如果unsigned值是過去最大int可以容納。這意味着一半的可能的unsigned值將導致錯誤的行爲,除非您特別小心。

如果您不得不毫無理由地進行轉換,那麼您應該重新審視如何將值存儲在第一位。

編輯:正如ProdigySim在評論中提到的,最大值取決於平臺。但您可以通過INT_MAXUINT_MAX訪問它。

對於通常的4個字節的類型:

4 bytes = (4*8) bits = 32 bits 

如果所有32位被使用,如在unsigned,最大值爲2^32 - 1,或4,294,967,295

一個簽名的int有效地犧牲了1位的符號,所以最大值將是2^31-1或2,147,483,647。請注意,這是其他值的一半。

+0

你知道未簽名的最大值是多少?併爲int? – 2011-02-26 20:30:52

+1

@Eric Brotto:這將取決於您正在編譯的系統。如果你需要檢查,通常有宏可用於INT_MAX,UINT_MAX。在大多數32位系統上,INT_MAX將是(2^31)-1,UINT_MAX是(2^32)-1。請注意,將UINT_MAX轉換爲int將爲-1。 – ProdigySim 2011-02-26 20:34:32

+2

「通常」是指C標準要求它們(對於託管系統)。 – 2011-02-27 03:38:22

2

如果您有變量unsigned int x;,則可以使用(int)x將其轉換爲int

1

它是如此簡單:

unsigned int foo; 
int bar = 10; 

foo = (unsigned int)bar; 

,反之亦然......

+3

演員陣容冗贅醜陋。賦值固有地包括在C中對於賦值有意義的類型(甚至對於某些不適用的類型)的轉換。演員通常只是爲了掩蓋不正確的代碼。 – 2011-02-26 22:20:04

+2

這不是真的,如果你正在檢查是否已經過了一段時間,這實際上是一個相當常見的問題。 你的間隔應該是一個無符號整數,因爲它沒有意義的被簽名,但time_t總是被簽名的,所以它可以代表比1970年早的日期。如果你在做if((now - 然後)>間隔)編譯器將生成警告。 – 2014-05-26 12:59:39

2

unsigned int類型可以被轉換爲符號的(或反之亦然),如下所示通過簡單的表達式:

unsigned int z; 
int y=5; 
z= (unsigned int)y; 

儘管未靶向的問題,你想讀下面的鏈接:

+1

我想你的意思是說「z =(unsigned int)y;」在上面的表達式中。由於y已經是一個整數,將它轉換爲int是毫無意義的... – 2011-06-01 15:50:34

+0

是......... :) – 2011-06-01 16:00:59

0

如果一個unsigned int和(signed)int的以相同的表達中使用的,符號int被隱式轉換爲無符號的。這是C語言的一個相當危險的特徵,因此您需要注意這一點。它可能是也可能不是你的錯誤的原因。如果你想得到更詳細的答案,你必須發佈一些代碼。

相關問題