確定乙個變數是有符號數還是無符號數

2025-07-27 03:21:18 字數 4339 閱讀 5045

1樓:受司大人

有一位同事在接受microsoft面試時,其中乙個題目就是「編寫一些**,確定乙個變數是有符號數還是無符號數」。這實際上是乙個相當難的問題,因為它留下了太多的空間讓你去理解這個問題。有些人錯誤地把「有符號數」同「具有負號」等同起來,以為這個問題只需要乙個小小的函式或巨集,測試變數的值是否小於零就可以了。

問題自然沒有這麼簡單。要回答這個問題,你必須在特定的編譯器中確定乙個給定的型別是有符號數還是無符號數。在ansi c中,「char」既可以是有符號數,也可以是無符號數,這是由編譯器決定的。

當你編寫的**需要移植到多個平臺時,知道型別是不是有符號數就非常有用了,如果該型別在所有的編譯器編譯時都是恆定的,那就再理想不過了。

你無法用函式實現目的。函式形式引數的型別是在函式內部定義的,所以它無法穿越呼叫這一關。因此,你必須編寫乙個巨集,根據引數的宣告對它進行處理。

接下來就是區別巨集的引數到底是乙個型別還是乙個型別的值。假定引數是乙個值,無符號數的本質特徵是它永遠不會是負的,有符號數的本質特徵是對最左邊乙個位取補將會改變它的符號(比如2的補碼錶示,它肯定是個負數)。由於作為引數的這個值的其它位與這個測試無關,你可以對它們全部取補,結果是一樣的。

因此,可以像下面這樣嘗試:

cpp] view plaincopy

#define isunsigned(a) (a >= &&a >= 0)

如果巨集的引數是乙個型別,其中乙個方法是使用型別轉換:

cpp] view plaincopy

#define isunsigned(type) (type)0 - 1 > 0)

面試的關鍵就在於正確理解問題!你需要仔細地聽,如果不理解問題或者覺得它的定義不清,可以要求乙個更好的解釋。第乙個**例子只適用於k&r c,新的類提公升規則導致它無法適用於ansi c。

microsoft的絕大部分問題都想考察你在壓力下能夠怎樣思考問題,但它們並不都是技術性的。

這是摘錄自《c專家程式設計》的一段話,我覺得很有啟發性。正確地理解問題是十分重要的,一不小心就會掉進陷阱中。

c語言平常定義變數時就比如int x都未指明是帶符號還是無符號,這是什麼情況?是預設無符號變數嗎?

2樓:魔群領袖

預設是有符號的,如果不要符號的前面加上unsigned int學習程式設計你可以不懂十進位。。。但必須懂16和2進位,當然補碼你只要知道大概原理就行,實際編碼中會用到,但是不會非常苛刻。

3樓:科技程式迷

unsigned 關鍵字就是用來說明是無符號的,所以反過來就知道 int x的x就是有符號的整型。

4樓:網友

int x;預設是宣告有符號的整型變數;

變數為負數,或結果可能是負數,則變數需要宣告有符號型別。

確定是變數不為負數,且不會得到負數結果,則變數可以宣告為無符號型別。

無符號整數和有符號整數怎麼區分?

5樓:angela韓雪倩

有無符號的整數,在計算機記憶體中是區別不出有無符號的,而是在程式裡有區分。計算機中資料是以補碼形式存放的,用二進位表示。比如:

預設無符號型,只要在型別符號加unsigned就是無符號型,int是有符號的。其實說白了就是:定義帶符號整數的,則可以儲存正負整數,定義無符號整數的,則只可以儲存正整數。

拓展資料:計算機裡的數是用二進位表示的,最左邊的這一位一般用來表示這個數是正數還是負數,這樣的話這個數就是有符號整數。如果最左邊這一位不用來表示正負,而是和後面的連在一起表示整數,那麼就不能區分這個數是正還是負,就只能是正數,這就是無符號整數。

計算機中的整數分為兩類:不帶符號位的整數(unsigned integer,也稱為無符號整數),此類整數一定是正整數;帶符號位的整數(signed integer),此類整數可以表示正整數,又可以表示負整數。

有符號和無符號的差別:

int是有符號的,unsigned是無符號的。

它們所佔的位元組數其實是一樣的,但是有符號的需要安排乙個位置來表達我這個數值的符號,因此說它能表示的絕對值就要比無符號的少一半。舉個例子,我們有乙個1個 [1] 位元組的整數(雖然這種型別不存在),那麼無符號的就是這樣:00000000~11111111 這個就是無符號的範圍。

乙個位元組是8位, 有符號的數,因為第乙個位要用來表示符號,那麼就只剩下7個位置可以用來表示數了0000000~1111111因為有符號,所以還可以表示範圍:-1111 111 ~ 1111 111。

6樓:網友

11111111 為二進位表示 255,這不用解釋什麼。

表示負數時,就是用二的補碼錶示法。

負數的二的補碼為「本身的反碼加1」,有:

1)1111111,符號位1表示負數。

就要按上面的逆運算進行。

除去符號位的七位(1111111),先減1得1111110。

求反碼,得0000001,代入符號,得-1

另外乙個例子:

10101010表示多少呢?

同上面步驟。

符號位1,負數。

0101010 先減1,得0101001,求反碼,得1010110,(64+16+4+2=86)代入符號,得-86

我本2樓)怎麼區分,是由最終怎麼使用這個資料來決定,如果作為無符號,就是255,如果看成有符號就是-1。由人為的協議規定,在高階語言中由變數的型別來標識出。

如果看成「有符號」整型,標誌位是區分的標誌。

7樓:沙裡波特

11111111 可以看成有符號整數轉為十進位結果為-127,也可看成無符號整數轉為十進位結果為 255,這是咋麼回事啊?

計算機內部的資料,都是由存放進去的。

1111 1111,究竟是多少?

誰存的,誰知道。 別人,就只能猜測了。

8樓:網友

乙個位元組是8位,用8位來表示乙個整數,如果是有符號的,第一位用來表示正負,0是正1是負。

如果不無符號的,那第一位也可用來表示乙個數位,這樣可擴大數的表示範圍有無符號,根據軟體或硬體有規定的。

考試的時候會講清,或約定的。

9樓:網友

有符號整數最高一位是符號位,0表示正,1表示負,所以看成是1111111,轉成十進位就是127

無符號整數無符號位,所以是11111111,轉成十進位就是255。

我是從「上海全鼎軟體學院」畢業的———

c程式中 有符號整型變數和無符號整型變數的區別在於?

10樓:網友

c語言程式中,有符號整型變數和無符號整型變數的區別在於,有符號整型佔用 4 byte,資料表達範圍 -2147483648~2147483647,無符號整型也是佔用 4 byte,資料表達範圍 0~4294967295。

11樓:網友

1、有符號整型變數可以表示負數。

2、無符號整型不能表示負數,但是表示的正數是有符號正數的2倍。

c語言中無符號數和有符號數進行運算時會轉換為無符號還是有符號?

12樓:狼一樣的少年

首先,浮點型別都是有符號的,有無符號只是對於整形變數而言,每個無符號型別的級別都與對應的帶符號型別相同,所以不能直接通過級數高低來轉換(級數高低是long double>double>float>long long>long>int>short>char,),但是如果帶符號型別的值域包含了無符號型別所表示的值,就把無符號轉化為有符號型別,否則,兩個運算元都轉化為對應的無符號型別。求採納~~

13樓:水瓶科曼多

c編譯器會隱含地將帶符號整數強制型別轉換為無符號數。

14樓:匿名使用者

轉換為兩者中擁有最大的數值的型別,所以是無符號啊!

verilog 中reg預設是有符號數還是無符號數

15樓:北自

是無符號數,它表示暫存器型別變數,是二進位編碼,而不是乙個多大的數字。

16樓:網友

既不是有符號數也不是無符號數,reg定義的數代表為二進位數。

你覺得乙個高電平是有符號數還是無符號數呢?

17樓:網友

預設是無符號的。

如果要用有符號的要用integer 或者用 reg signed

18樓:潔之殤殤

預設的是無符號數。

有符號是可以加上 reg signed [3:0] a...

19樓:幽靈夜雨

reg只是代表這個是個暫存器而已。

叉的所有的特殊符號有哪些,乙個叉叉的特殊符號

1 電腦鍵盤上特殊符號和標點符號的輸入方法 符號的輸入方法 中文狀態下,我們按下鍵盤上shift鍵 主鍵盤區的數字區的鍵,從左右至右就可以輸入 符號。2 如輸入 符號,在中文狀態下按住shift 2 4 7 8 就可以輸入 符號 3 符號的輸入方法 英文狀態下,我們按下鍵盤上shift鍵 主鍵盤區的...

人是有欲有求好還是無欲無求好,乙個人無慾無求,活著還有什麼意思

只有達到了自己的有欲有求,才能夠上公升到無欲無求的境界。有欲有求,是人要有活著的目標,當然一定是積極向上的才好,如果是反面的,最後就是深淵。無欲無求,是一種滿足於現狀之後的精神境界,不爭額外的身外之物,不搶他人的心頭之好,能做到無欲無求的人,大都是心理非常強大 內心非常幸福的,不是人人都能達到的境界...

倒寫e這個符號怎麼打,有乙個反過來的e的符號怎麼打

在word的插入 字元 拉丁語擴充可以找到。用微軟2003輸入法的內碼輸入方式可直接用0259 打出 倒寫e這個符號怎麼打 在word的插入 字元 拉丁語擴充可以找到。用微軟2003輸入法的內碼輸入方式可直接用0259 打出 嗎?看不清圖 的話用搜狗輸入法打 de 第五個就是。有乙個反過來的e的符號...