數(shù)據(jù)超過類型規(guī)定的大小怎么辦
C語言中,如果需要用的整數(shù)大于int類型的最大值了怎么辦?
我們知道int能表示的最大數(shù)是2147483647,最小的數(shù)是-2147483648,為什么?
因?yàn)樽?2位系統(tǒng)中,寄存器是32位的,寄存器中最高位表示符號(hào)位,0表示整數(shù),1表示負(fù)數(shù);
所以32位系統(tǒng)中int的最大值可以表示為0111 1111 1111 1111 1111 1111 1111 1111,這個(gè)二進(jìn)制的數(shù)就是2147483647
程序示例1:
#include <stdio.h>
int main()
{
int i = 2147483647;
short s = 32767;
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %d\n", i);
printf("s = %d\n", s);
return 0;
}
輸出結(jié)果:
i = 2147483647
s = 32767
i = -2147483648
s = -32768
結(jié)果是不是很奇怪,最大的數(shù)加1之后怎么都有個(gè)負(fù)號(hào)了,不可能,絕對(duì)不可能。
但是事實(shí)擺在面前了,什么原因?就是因?yàn)閿?shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)的問題了,前面說了,數(shù)據(jù)在內(nèi)存中存儲(chǔ),默認(rèn)最高位是符號(hào)位,默認(rèn)存的數(shù)據(jù)就是有符號(hào)的;還有一個(gè)原因,正整數(shù)在內(nèi)存中存的是源碼,負(fù)整數(shù)在內(nèi)存中存的是補(bǔ)碼。數(shù)據(jù)到頭之后再加1,你的數(shù)據(jù)極性就發(fā)生了翻轉(zhuǎn)。
也就是說我們寫的int ,編譯器默認(rèn)的是signed int;
signed int的數(shù)據(jù)范圍是:-2147483648 ----?2147483647
我們也可以主動(dòng)聲明數(shù)據(jù)類型,unsigned int無符號(hào)整型,內(nèi)存里面的32位全部是數(shù)據(jù),沒有符號(hào)位了,那數(shù)據(jù)的范圍就是:0 -- 4294967295
同理也就有了unsigned short、unsigned char。
收到啟發(fā),把
程序示例1的代碼修改一下,加個(gè)unsigned進(jìn)去
程序示例2:
#include <stdio.h>
int main()
{
unsigned int i = 2147483647; //無符號(hào)int
unsigned short s = 32767; //無符號(hào)short
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %d\n", i);
printf("s = %d\n", s);
return 0;
}
輸出的結(jié)果感覺還是錯(cuò)的,
i = 2147483647
s = 32767
i = -2147483648
s = 32768
而且是short的數(shù)據(jù)是對(duì)的,int的數(shù)據(jù)是錯(cuò)的,怎么回事?
這是因?yàn)榇蛴〕隽藛栴},我們打印的格式是%d,默認(rèn)還是有符號(hào)的整型,那為什么short類型的數(shù)據(jù)是對(duì)的呢,因?yàn)閟hort數(shù)據(jù)太小了,內(nèi)存里面存數(shù)據(jù)是32位的,short類型數(shù)據(jù)還沒有溢出。
程序需要進(jìn)一步修改,打印數(shù)據(jù)類型改為%u,就是輸出無符號(hào)整型了,
程序示例3:
#include <stdio.h>
int main()
{
unsigned int i = 2147483647;
unsigned short s = 32767;
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %u\n", i); //打印數(shù)據(jù)類型是%u
printf("s = %d\n", s);
return 0;
}
輸出的結(jié)果終于正常了
i = 2147483647
s = 32767
i = 2147483648
s = 32768
在單片機(jī)開發(fā)中,無符號(hào)的整型用得比較多。
數(shù)據(jù)在內(nèi)存中的表現(xiàn)
char? ?占一個(gè)字節(jié)? 數(shù)據(jù)范圍? ?-128--127
short? 占兩個(gè)字節(jié)? 數(shù)據(jù)范圍? -32768--32767
int? ? ? 占4個(gè)字節(jié)? ?數(shù)據(jù)范圍? ?-2147483648 ----?2147483647
要想知道變量或者類型所占用的內(nèi)存大小,也就是占用幾個(gè)字節(jié),可以使用sizeof函數(shù)來查詢,用法如下:
sizeof(變量);
sizeof(類型);
sizeof 變量;
程序示例4:
#include <stdio.h>
int main()
{
int s = sizeof(short);//short 類型占2個(gè)字節(jié),s=2;
int n = sizeof s;
printf("s = %d\n", s); //s的值是2,類型是int
printf("n = %d\n", n); //n的值是4,
return 0;
}
輸出結(jié)果:
s = 2
n = 4
把常見的類型所占內(nèi)存的情況都可以打印出來看看
程序示例5:
#include <stdio.h>
int main()
{
printf("char類型變量占用 %d個(gè)字節(jié)\n", sizeof(char));
printf("short類型變量占用 %d個(gè)字節(jié)\n", sizeof(short));
printf("int類型變量占用 %d個(gè)字節(jié)\n", sizeof(int));
printf("float類型變量占用 %d個(gè)字節(jié)\n", sizeof(float));
printf("double類型變量占用 %d個(gè)字節(jié)\n", sizeof(double));
return 0;
}
輸出結(jié)果:
char類型變量占用 1個(gè)字節(jié)
short類型變量占用 2個(gè)字節(jié)
int類型變量占用 4個(gè)字節(jié)
float類型變量占用 4個(gè)字節(jié)
double類型變量占用 8個(gè)字節(jié)
程序示例6:
#include <stdio.h>
int main()
{
printf("無符號(hào)char類型變量占用 %d個(gè)字節(jié)\n", sizeof(unsigned char));
printf("無符號(hào)short類型變量占用 %d個(gè)字節(jié)\n", sizeof(unsigned short));
printf("無符號(hào)int類型變量占用 %d個(gè)字節(jié)\n", sizeof(unsigned int));
return 0;
}
輸出結(jié)果:
無符號(hào)char類型變量占用 1個(gè)字節(jié)
無符號(hào)short類型變量占用 2個(gè)字節(jié)
無符號(hào)int類型變量占用 4個(gè)字節(jié)
以上說明無符號(hào)整數(shù)與有符號(hào)整數(shù)所占的內(nèi)存是一樣的。
奇怪的數(shù)據(jù)類型
有short就有l(wèi)ong,但是這個(gè)long在不同的編譯器里面結(jié)果卻是不一樣的
long一般是占4個(gè)字節(jié),但也可能占8個(gè)字節(jié);
還用奇葩的類型,long long,也就是long long int的簡(jiǎn)寫,占8個(gè)字節(jié);
程序示例7:文章來源:http://www.zghlxwxcb.cn/news/detail-700122.html
#include <stdio.h>
int main()
{
printf("long類型變量占用 %d個(gè)字節(jié)\n", sizeof(long));
printf("long long類型變量占用 %d個(gè)字節(jié)\n", sizeof(long long));
return 0;
}
輸出結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-700122.html
long類型變量占用 4個(gè)字節(jié)
long long類型變量占用 8個(gè)字節(jié)
到了這里,關(guān)于C語言學(xué)習(xí):8、深入數(shù)據(jù)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!