C語言基礎(5)-有符號數、無符號數、printf、大小端對齊


1.有符號數和無符號數

有符號數就是最高位為符號位0代表正數,1代表負數

無符號數最高位不是符號位,而就是數的一部分而已。

1011 1111 0000 1111 1111 0000 1011 1010,如果當有符號數看待,那么他是一個負數的補碼,如果當一個無符號數看待,他就是一個正數的原碼

無符號數最小為0,不可能是負數

定義一個無符號的int

unsigned int a; //使用unsigned int 定義了一個無符號的int變量,名字叫a

 

short,long,long long, unsigned int

short是短整型,一般shortint的一半大小,short32位的windows下是2個字節

short最大能存放多大的十六進制數?7fff

當一個小的數據類型賦值給一個大的數據類型,不會出錯,因為編譯器會自動轉化,但當一個大的類型賦值給一個小的數據類型,那么就可能丟失高位。

long是長整型,long的大小變化比較多,在32位的windows下是4個字節,在64位的windows4個字節,在32位的linux4個字節,在64位的linux8個字節

long long長長整型,longlong32位系統和64位系統下都是8個字節

unsigned int,unsigned short ,unsigned long, unsigned long long

100默認是int,100L代表long類型的常量,100LL代表long long類型的常量

100u代表unsigned int類型的常量,如果想表達一個unsigned long long 類型的常量,100ull

9l,9L,9ll,9LL,9u,9ull,9ULL

2. printf輸出值

%d輸出一個有符號的10進制int類型

%o,輸出8進制的int

%x,輸出16進制的int

%X,輸出16進制的int,但abcd這些都用大寫字母

%u,輸出一個10進制的無符號數

%p 輸出內存地址

%u的意思是輸出一個unsigned int 類型的數

%lu的意思是輸出一個unsigned long 類型的數

%f 的意思是輸出float類型的數

%lf是輸出double ,long double 類型的浮點數

%c是輸出一個char類型的字符

例:以十六進制形式輸出一個byte值,帶前綴,空位補0:

byte a = 10;

printf("a is: %#04x\n", a);

得到的值是:0x0a

# 代表加上十六進制的前綴也就是0x, 04代表輸出寬度為4,寬度不足以0補齊。

3. 大端對齊和小端對齊

計算機的內存最小單位是什么?是BYTE,是字節,一個大於BYTE的數據類型在內存中存放的時候要有先后順序。

高內存地址放整數的高位,低內存地址放整數的低位,這種方式叫到着放,術語叫小端對齊。X86ARM都是小端對齊的。

高內存地址放整數的低位,低內存地址放整數的高位,這種方式叫正着放,術語叫大端對齊,很多unix服務器的CPU是大端對齊的。

定義一個int類型的變量a,在VS下可以看到其在內存中的排列方式如下:

說明windows系統是小端對齊的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM