C語言輸出整型時為什麼有時會輸出負數

2021-03-04 08:56:52 字數 4011 閱讀 7950

1樓:匿名使用者

可以把**貼出來嗎

樓主,我沒有出現你的情況

我用的是你的**,運用wintc編譯,**如下#include "stdio.h"

main()

輸入4-7,輸出為4,-7

沒有出現溢位現象

2樓:匿名使用者

溢位了吧,用unsigned int試試。

3樓:我有個將軍夢

整型的範圍是-127~128

在c語言中將乙個很大的正整數賦值給乙個int型別變數a,輸出a時有時會顯示負值,為何?

4樓:聽不清啊

在不同的抄c系統中,int有不同的表示範圍。

32位(4位元組)的int,它可以表示的數字範圍是-2147483648~+ 2147483647,共可表示4294967296個不同的數。

這是因為它有點像我們用(每個檔位上只可以表示0~9)的算盤。假如我們的乙個算盤有4個檔位,它能表示從0~9999共10000個不同的數字。當我們要把比9999更大的數字存放到算盤上時,走出的部分就「丟失」了。

如果要存的數字是12345,按「老規矩」存放完畢後,讀取算盤上的數字時,由於資料發生了丟失,只能讀到2345。這是由於12345-10000=2345。

再來看計算機裡的int,如果我們要把2147483648存入到int變數中時,由於超出了範圍,就發生了丟失。讀取時,就變成了2147483648-4294967296=-2147483648了。

其它更大的數字,所變成的負數大小,也是這樣的規律(都是減去了4294967296或它的倍)。

5樓:玩尼丶瑪

int 型只可以表示來 —36768到+32767 這其實是一自

個邏輯圈,意思就是說如果該數超過了最大表示範圍那麼就從頭開始,舉個例子吧 ,如 +32788超過了最大表示範圍,比最大表示範圍多1,那麼該數其實就是-32768

c語言問題,為什麼會輸出負數

6樓:匿名使用者

在你的switch語句最後都加乙個default:看一下switch(d)

switch(u)

如果出現error這行,說明你的fflush()沒有起作用,改正方法是在scanf()函式後,加乙個getchar();

如果沒有出現,把你的輸入資訊粘出來,即x d u都是什麼。再幫你看

7樓:匿名使用者

這個問題有多種可能,不一而足。

演算法有錯誤,最終計算結果是負數。輸出自然會是負數。

例如:int a=1;

int b=a-2;

printf("b=%d",b);

//輸出結果:b=-1

超過變數型別的最大取值範圍,發生溢位。

例如turbo c裡int是16位,取值範圍-32768~32767。如果計算過程當中,數值超過32767,由於補碼的關係。結果就有可能是負數。

這種情況,就需要使用取值範圍更大的資料型別。

例程:#include

void main()

//輸出結果:a=32767,b=-32768

8樓:無丹羿昭

我的感覺是,在你執行printf

這個過程中,輸出%d的時候,其實你的a的值已經出問題了,所以後面也會有錯。你可以試試看,把%d放到第二個輸出,你就會發現,第乙個問題,後兩個出問題了。你可以改成這樣。

當你在執行第二個printf的時候,你的a的值就是為double型等於1.550000,然後再開始執行第二個printf

9樓:匿名使用者

溢位了,把資料型別定大一些

10樓:囂張得很

把用float定義的變數全改成double定義,把用%f全改成%lf

如圖:c語言程式中無符號數a的值是負數,為什麼作整形輸出時的結果是64870?

11樓:匿名使用者

負數在記憶體中是以補碼的形式儲存的,

即 -666

原碼:1000 0010 1001 1010

反碼:1111 1101 0110 0101 (符號位不變,其它位取反)

補碼:1111 1101 0110 0110 (反碼+1)

即,實際記憶體中的資料為0b1111 1101 0110 0110=64870

而a為unsigned short int,所以反饋的應該就是64870正數。

12樓:匿名使用者

-666 在記憶體中的是以補碼的形式存在的

-666的原碼是

1000 0010 1001 1010

補碼是 原碼除符號位(第1位)外各位取反+1,所以是1111 1101 0110 0110

由於a是無符號數,所以第一位的1不在表示負數,1111 1101 0110 0110 的十進位製數就是64870

c語言無符號整形和無符號短整型顯示負數結果為什麼不一樣?

13樓:匿名使用者

因為printf裡用%d來輸出某個變數時,程式會預設該變數為int型。如果該變數

是內整型,容但不是int,而是char或者short,程式會先把它轉換成int型,再傳給printf.

所以用unsigned int a=-12時,沒有上面所說的轉換步驟,%d當成有符號整數,輸出是-12,沒問題。

unsigned short a=-12時, 注意這時候a是16位,在記憶體中是11111111 11110100,轉換成int型會變成32位,程式在它的左邊會新增16個0,變成00000000 00000000 11111111 11110100,這時候符號位是0了,當然變成正數了。

14樓:匿名使用者

顧名思義,無bai符號是du沒有符號的,只能zhi

儲存非負數。所以顯dao示結果是不一版樣的。

在計算權機內部,負數與非負數沒有區分,只是負數用補碼形式儲存,補碼是原碼按位取反再加1得到的。對於負數來說首位一定是1,假如作為正數,將是乙個很大的數,也就變成了另乙個數了。

15樓:匿名使用者

無符號整型和無符號短整型所佔的位元組數是不一樣的

16樓:匿名使用者

你把它寫成2進製就知道了!

c語言unsigned賦負值後以整型輸出還是賦值。為什麼?

17樓:傅螺六秀英

不是int存不下

而是你的棧空間不足

20萬就是200000*4=800000

需要800k左右的記憶體。

明顯棧溢位了

修改方法也很簡單

要麼用new動態分配

要麼定義成全域性變數

比如const unsigned int arrsize = 200000;

const unsigned int nstart = 10000;

const unsigned int nend = 99900;

int a[arrsize];

int main()

18樓:萊牧駱冬雁

輸出的時候型別是由

printf

的格式串指定的:

看看這個執行的結果你就明白:

intmain()

19樓:扶明軒轅懋

unsigned

定義的型別並不改變值在記憶體中的形式,這你要控制輸出為無符號型的,就像是我們如果定義乙個char型別的,輸出如果用%d的話,那麼顯示的還是數字而不是字元。如果要輸出無符號型別的話,**u,如printf("%u",n);長整型的是%lu

,所以unsigned只是你希望定義的那個是無符號整型,但是輸出語句還是按照它的理解來翻譯,這就造成了一些小小的問題

就是要不要顯示符號,只在於你輸出的時候控制,而不在於你定義的時候如何定義。

為什麼我有時會忘記一些事情,為什麼我有時會忘記一些事情,而且就完全記不起來了呢?

忘記說明你的世界很精彩總是充滿新鮮這樣很好的 不過重要的事,還是要做好記錄備忘的 人的大腦也需要減壓的,不可能記得每件事情。人每天的遺忘量在1 4。為什麼我有時會忘記一些事情,而且就完全記不起來了呢?記憶不是永久的,是會更新的,不斷的更新某個記憶,會使某些事情被一直記住。但記憶也不是你想不起來就一定...

c語言為什麼輸出的值一直是,c語言為什麼輸出的值一直是

default這個加上,還有個就是精度問題 include int main printf g n y return 0 c語言輸出的值永遠是0.000000000000000 順序流程問題。一開始你沒給a b c d賦值就執行d a b c。此時d的結果是垃圾值。然後你接下來用鍵盤給a b c賦值...

為什麼人體有時會帶電

人體靜電 人體帶電方式 日常生活中我們常有這樣的經歷 用塑料梳子梳頭時感到毛髮被梳子吸引,也會聽到輕微的放電聲 後,手靠近椅子或門把手等金屬體,會遭到電擊.人體表面電阻率微小,同其他物體分離過程中電荷迅速反流,中和,因而不能起電.人體靜電主要由衣服,鞋等起電後傳導給人體並積聚起來的.人在地毯上行走,...