c語言的基本資料型別有三種:
c語言的最早的基本資料型別就是這三。(後面還有c90,c99,c11剛更新的,以後再說)
今天的重點是結合實際來發現c語言基本資料型別的記憶體溢位問題。
首先,c語言在標頭檔案裡面定義了幾種資料型別的值範圍。
char
intshort
long
long long
schar_max
int_max
shrt_max
long_max
llong_max
schar_min
int_min
shrt_min
long_min
llong_min
uchar_max
uint_max
ushrt_max
ulong_max
ullong_max
cahr_max
char_min
在了解記憶體溢位問題前我們先補充一下計算機基礎知識---數字系統。
計算機是從自然界抽象出來的計算工具,所以我們需要將自然界的資料儲存到計算機上,它才能進行計算。所以人們就發明了二進位制儲存方式。(不要問我為什麼不用十進位制,因為在機器中用電流來表示0和1,頻率高的是1,低的是0,真的是為難喔乙個渣渣文科生了。而最早的計算機非常龐大,非常耗電,用十進位制電流很不穩定。先不說技術問題,當時的電還真的燒不起這十進位制的機器。真感興趣的可以去查資料。)
關於進製,喔預設為你知道了解,並能進行簡單運算。
那麼怎麼把資料存進去呢?
這二我們就得提到這世界上的10種人了,懂二進位制和不懂二進位制的。
1,原碼:就是用二進位制直接表示。(也就是unsigend數)
可是問題來了二進位制表示那負數怎麼表示呢?(比如-1,-2)
對就是將四位0000的最高位用來表示符號(0為正,1為負)
例如:0001(1) + 1001(-1) = 1010(-2) 不成立啊
0000 + 1000 =1000(-0)這完全不符合自然邏輯啊
可是原碼表示有符號數時存在乙個負零,這是與我們的初衷不負的。怎麼辦?
2,那就是反碼:將有符號數符號位不管,其他位反轉(0變1,1變0),正數的反碼就是它本身。
例子:0001 + 1110 = 1111 再進行取反運算就成了 1000,結果是對了,可是負零,你不覺得有什麼不妥嗎?
3,再來,補碼就是在反碼的基礎上加一。(同樣正數不進行處理)
(再一次感慨老大的聰明,說計算機不要天賦的,自己多揣摩吧!但是咱們也不能灰心啊)
例子:0001 + 1111 =11110 處理:去掉最高位,加一,取反——————0000就是0啊
好,終於把大象塞進冰箱了。該關門了。
這裡我們只討論整型的溢位問題。
#include #include //整型的記憶體溢位
int main(void)
看到了吧,int_max + 1 = int_min。
大家可以以時鐘來聯想這個溢位問題,一下就懂了。
十二點加一,指標不會指向十三點而是一點。
註解:c語言中int是預設的有符號型整數。(為了方便輸入嘛)
C 基本資料型別
型別識別符號 型別說明 長度 位元組 範圍備註 char字元型 1 128 127 27 27 1 unsigned char無符字元型 10 255 0 28 1 short int短整型 2 32768 32767 2 15 215 1 unsigned short int無符短整型 20 65...
C 基本資料型別
1.基本資料型別 程式中的變數都是先定義,後使用的。對變數的定義,可以包括三個方面 資料型別 儲存型別 作用域。所謂資料型別是按被定義變數的性質,表示形式,佔據儲存空間的多少,構造特點來劃分的。在c語言中,資料型別可分為 基本資料型別 構造資料型別,指標型別 空型別。基本型別 整型 字元型 實型 浮...
C 基本資料型別
型別別名位 允許的值 sbyte system.sbyte 8在 128 127 之間的整數 byte system.byte 8在 0 255 之間的整數 short system.int16 16在 32 768 32 767 之間的整數 ushort system.uint16 16在 0 6...