在C語言中,unsigned char是什麼型別?
unsigned char是無符號位元組型,char型別變數的大小通常為1個位元組(1位元組=8個位),且屬於整型。整型的每一種都有無符號(unsigned)和有符號(signed)兩種型別(float和double總是帶符號的),在預設情況下宣告的整型變數都是有符號的型別(char有點特別),如果需宣告無符號型別的話就需要在型別前加上unsigned。無符號版本和有符號版本的區別就是無符號型別能儲存2倍於有符號型別的資料,比如16位系統中一個int能儲存的資料的範圍為-32768~32767,而unsigned能儲存的資料範圍則是0~65535。
同樣,在32位系統中一個char型別一般為8個bit,所以能儲存的資料範圍為-128~127,而unsigned char則是0~255,字元型所儲存的資料是用來表示字元的,例如ASCⅡ或Unicode。
關於char的符號(選自thinking in C++ 2nd vol1):
signed is the default and is only necessary with char; char may or may not default to signed. By specifying signed char, you force the sign bit to be used.
譯:有符號型別是預設(指的是對於其他整型來說)的型別並且僅對於char來說才是必須的。char有可能是signed也有可能是unsigned(我想這可能取決於編譯器或具體實現)。但通過顯式地指定一個char為signed,你就迫使其成為有符號的字元型
在定義整數變數的型態的時候可以加上 unsigned 或是 signed, 例如 unsigned char unsigned short (int) unsigned long (int) unsigned int ---------- signed char signed short (int) signed long (int) signed int -------------- 上面 signed 有加和沒有加是一樣的意義 加上 unsigned 以後, 1. 所需要的資料儲存空間和沒有加 unsigned 時是一樣的 2. 在使用 printf() 列印時基本上你必須分清楚 unsigned 有影響到的是引數的傳遞, 使用 %d 或是 %u 基本上是看程式設計者自己的選擇 int i=-1; printf("%d %u/n", i, i); 會印出 -1 4294967295 unsigned int i=-1; printf("%d %u/n", i, i); 也會印出 -1 4294967295 char i=-1; printf("%d %u/n", i, i); 還是會印出 -1 4294967295 但是 unsigned char i=-1; printf("%d %u/n", i, i); 則會印出 255 255 這不是 %d 和 %u 的問題, 而是 引數傳遞時資料轉換的問題 (見下面第 3 項) 不一樣的地方有下面幾個 1. 資料的範圍基本上加上 unsigned 以後會變成 2 倍 2. 程式裡比較大小的時候 int i=1; int j=-1; if (i>j) printf("i>j/n"); else printf("i<=j/n"); 你會發現結果是 i>j unsigned int i=1; int j=-1; if (i>j) printf("i>j/n"); else printf("i<=j/n"); 你會發現結果是 i<=j 也就是說 signed 和 unsigned 在比較的時候 compiler 會把 signed int 自動當成 unsigned int 來比較 2. 資料轉換的時候 (或是函式呼叫的時候) char i = -128; int j = i; 變數 i 裡面的資料只有 1 個位元組, 要放進 變數 j 裡面的時候需要做 sign extension 也就是多出來的 3 個位元組 (24 個 bit) 都要 填入原來 i 的 sign bit (第 8 個 bit) 以上例來說 (用二進位制表示) i: 10000000 j: 11111111 11111111 11111111 10000000 unsigned char i = -128; int j = i; 由 unsigned 轉為 signed 時前面一率補 0 用二進位制表示 i: 10000000 j: 00000000 00000000 00000000 10000000 char i = -128; unsigned int j = i; 還是做 sign extension 用二進位制表示 i: 10000000 j: 11111111 11111111 11111111 10000000 函式呼叫的時候會做型態的轉變, 例如 void fun(int x) { ... } 呼叫時如果用 unsigned char i=-1; fun(i); 就會自動做轉換
相關推薦
在C語言中,unsigned char是什麼型別?
unsigned char是無符號位元組型,char型別變數的大小通常為1個位元組(1位元組=8個位),且屬於整型。整型的每一種都有無符號(unsigned)和有符號(signed)兩種型別(float和double總是帶符號的),在預設情況下宣告的整型變數都是有符號的型別(
在C語言中,int ,char 等幾種資料型別所佔用的空間
在32位處理器中,int a; sizeof(a)=4;char a; sizeof(a)=1;float a; sizeof(a)=4;double a; sizeof(a)=8;long a; sizeof(a)=4;long int a; sizeof(a)=4;s
【轉載】在C語言中,double、long、unsigned、int、char類型數據所占字節數
src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&
C語言中,變數的儲存型別有幾種?
在C語言中,對變數的儲存型別說明有以下四種: auto 自動變數 register 暫存器變數 extern 外部變數 static 靜態變數
C語言中,隱藏結構體的細節
all printf span 包括 strcpy () 創建 提高 結構體指針 我們都知道,在C語言中,結構體中的字段都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變量默認為private,而結構體中默認為public。結構體的這一個特性,導致結構
C語言中,當計算字符數組長度時,用sizeof 和strlen 的原理及兩者的區別
指針 data- 編譯器 tracking 行處理 ews csdn 編譯 分配 字符數組的長度計算:必須以終止符’\0‘作為邊界,但對字符數組賦值時,有兩種方式: 1:定義時用字符初始化 (1)char chs[7] = {‘a‘, ‘c‘, ‘0‘, ‘z‘, ‘3
c語言中,while(1)語句使用break語句跳出迴圈
這個要分情況的:1:本身條件就有出口,這樣的話,可以自然退出,也可以認為退出2:如果本身條件永遠不可能滿足,例如:while(1)像這種的話想要退出的話就必須人為干涉,例如int num = 0;while(1){ num++; if(num >1000
C語言中,標頭檔案和原始檔的關係(轉)
//a.h void foo(); //a.c #include "a.h" //我的問題出來了:這句話是要,還是不要? void foo() { return; } //main.c #include "a.h" int main(int argc
C語言中,為什麼字串可以賦值給字元指標變數
1.以字串形式出現的,編譯器都會為該字串自動新增一個0作為結束符,如在程式碼中寫 "abc",那麼編譯器幫你儲存的是"abc\0" 2."abc"是常量嗎?答案是有時是,有時不是。 不是常量的情況:"abc"作為字元陣列初始值的時候就不是,如 char str[] = "
C語言中‘,’運算子存在的意義
逗號運算子(‘,’)是C語言中優先順序最低的運算子,它用於連線兩個表示式(n-1個‘,’可以連線n個表示式)並從左至右執行表示式,最後一個表示式的值作為整個表示式的值。基本格式如下: 表示式1,表示式2,表示式3…,表示式n 舉個例子: #incl
c語言中32為地址型別轉換為64位整數型別
uint64_t idt_operand = ((sizeof(idt) - 1) | ((uint64_t)(uint32_t)idt << 16)); idt是陣列名,也就是結構陣列型別的指標。static struct gate_desc idt[IDT
[C]c語言中,scanf裡面要是陣列要不要加&?
先上一段程式碼給大家看下 #include<stdio.h> int main(){ int a[100]; int n,i; scanf("%d",&n);//輸入個數 fo
C語言中,函式指標陣列的用途:轉移表
計算器的實現: 方法一: #include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b)
C語言中,標頭檔案的作用,標頭檔案和原始檔的關係(轉)
簡單的說其實要理解C檔案與標頭檔案(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段 2.詞法與語法分析階段 3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 (.obj檔案) 4.連線階段,將各個目標檔
C語言中,如何通過函式來改變一個變數的值
最近看面試題,遇到一些關於通過函式改變一個變數的值得問題,現在終結一下: 先看下面一段程式碼: #include <stdio.h>#include <stdlib.h> void GetMemory(char *p) { p=(char
C語言中,通過指標給結構體中的變數賦值
typedef struct Mech_Para// { int32_tP001_TipBoxX; int32_tP002_TipBoxY; int32_tP003_TipBoxZ; int32_tP004_IntervalX; int32_tP005_IntervalY;
C語言中,關於陣列和結構體變數的的預設初值問題
結果自己跑一下,需要自己修改不同賦初值情況來驗證,乾貨就是註釋 #include <iostream> #include <stdio.h> using namespace std; int val;//外部變數預設值為0 typedef stru
在C語言中,static靜態變數,extern外部變數的區別
1:什麼是static static,叫做靜態變數。一般用於全域性變數裡面,首先,我們來考慮一下為什麼要用到static,我們可以想一下,一個專案其實是由很多位工程師一起來完成的,他們之間是互相獨立完成自己所要完成的一個模組的,這就有可能出現定義相同的全域性變數或者全域性函
在C語言中,int型資料的取值範圍?
在C語言中,int型資料所佔的位元組和具體的編譯器有關,32位編譯器int佔4個位元組(VC,C-free),16位編譯器int佔2個位元組(詳見“int型資料所佔位元組和什麼有關”)。 以兩個位元組為例: 在C中,int型資料是一個有符號的整型資料,其最高位為符號位(0表
C語言中,斷言的使用
標準C中的斷言函式assert(),如果斷言函式的引數為0時將觸發斷言函式的執行,會在執行時程式崩潰。 我從FreeRTOS中學到,FreeRTOS中的斷言函式configASSERT()和標準C中的斷言函式assert()是一樣的, 我們可以重新利用他,下面我用一個簡單的