2011-12-06 43 views
3

我會通過現有的代碼和調試該聲明的UTC時間爲當將一個unsigned int變量變爲負

unsigned int utc_time;

我可以每次都獲得了一些積極的整數由我會確定我得到時間。但突然在代碼中,我得到了一個聲明爲無符號整數的變量的負值。

請幫我理解可能是什麼原因。

+1

你是如何調試代碼的? printf的? – 2011-12-06 04:41:51

+0

你能告訴我們違規代碼嗎? – AusCBloke

回答

9

無符號整數,就其性質而言,可以從不爲負數。

您可以用負值結束了,如果你將它轉換爲有符號整數,或者乾脆值分配給一個有符號整數,甚至錯誤地把它當作簽署,如用:

#include <stdio.h> 

int main (void) { 
    unsigned int u = 3333333333u; 
    printf ("unsigned = %u, signed = %d\n", u, u); 
    return 0; 
} 

輸出:

unsigned = 3333333333, signed = -961633963 

在我的32位整數系統上。

+0

或者如果您將它視爲已簽名,例如通過使用帶有「%d」格式的'printf'打印,需要(signed)int參數。 –

+0

@KeithThompson這不是例子所示嗎? –

+0

@HunterMcMillen:這個例子是在Keith發表評論時編輯的,時機良好。 – AusCBloke

3

當它被鑄造或被視爲signed類型。您可能將unsigned int打印爲int,並且unsigned的位序列將對應於負值signed值。

即。也許你做的事:

unsigned int utc_time; 
... 
printf("%d", utc_time); 

哪裏%dsigned整數,相比%u它用於unsigned。無論如何,如果您向我們顯示代碼,我們將能夠確定地告訴您。

unsigned變量中沒有肯定或否定的概念。

1

大多數(所有?)C程序中的負數表示爲無符號數加1的two's complement。調試器或列出值的程序可能不會將其顯示爲無符號類型,因此您會發現它是二進制補碼。

+0

當然,大多數,但不,不是所有:-) – paxdiablo

3

確保您使用

printf("%u", utc_time); 

顯示它


在迴應評論%u顯示varible成unsigned int,其中作爲%i%d將顯示varible作爲簽署INT。

+1

0pts - 添加一個描述,你做了什麼,爲什麼它需要一個upvote。 –

+0

感謝您的反饋@威爾。 – mikek3332002

相關問題