請教unsigned char 指標和char指標和有啥區別?謝謝
uj5u.com熱心網友回復:
有符號和無符號的區別uj5u.com熱心網友回復:
我知道有符號和無符號
但我想請教它們的使用區別
謝謝
uj5u.com熱心網友回復:
有符號只是用了7位,最高位為符號位,表示資料位-128到127,負數用補嗎表示。無符號使用了8位,表示資料是0-255.
uj5u.com熱心網友回復:
不是uj5u.com熱心網友回復:
指標是一個地址,也有有符號和無符號之分?
uj5u.com熱心網友回復:
地址沒有區別,區別只在于如何確定它指向的東西。。。。
uj5u.com熱心網友回復:
有符號只是用了7位,最高位為符號位,表示資料位-128到127,負數用補嗎表示。
無符號使用了8位,表示資料是0-255.
指標是一個地址,也有有符號和無符號之分?
地址沒有區別,區別只在于如何確定它指向的東西。。。。
但我吧熊定義個char指標指向unsigned char字符,編譯通不過
uj5u.com熱心網友回復:
這樣是要報錯的unsigned char c='\0';
char *pt_c=&c;
rror C2440: “初始化”: 無法從“unsigned char *”轉換為“char *”
uj5u.com熱心網友回復:
int *p_i = 0x12345678;char *p_c = 0x12345678;
unsigned char *p_uc = 0x123456789;
p_i和p_c指向的是同一個地址、位置。
當你嘗試取值的時候發現問題有點區別了。
嘗試取p_i所指向的值的時候
通過代碼:
var a = *p_i ;//此時會發現 *p_i取的是,從0x12345678開始4個位元組的資料,來視作int
var a = *p_c;//此時會發現 *p_i取的是,從0x12345678開始1個位元組的資料,來視作char
var a = *p_uc;//此時會發現 *p_ui取的是,從0x12345678開始1個位元組的資料,來視作unsigned char
uj5u.com熱心網友回復:
int *p_i = 0x12345678;
char *p_c = 0x12345678;
unsigned char *p_uc = 0x123456789;
p_i和p_c指向的是同一個地址、位置。
當你嘗試取值的時候發現問題有點區別了。
嘗試取p_i所指向的值的時候
通過代碼:
var a = *p_i ;//此時會發現 *p_i取的是,從0x12345678開始4個位元組的資料,來視作int
var a = *p_c;//此時會發現 *p_i取的是,從0x12345678開始1個位元組的資料,來視作char
var a = *p_uc;//此時會發現 *p_ui取的是,從0x12345678開始1個位元組的資料,來視作unsigned char
感謝,請問p_c 和p_uc保存的地址是一樣的嗎?我還是看不出來它們的區別?
P_C保存的地址可以賦值給P_UC嗎?
其實我是想將記憶體里的一個byte,memcpy到一個char型變數,然后判斷十進制的值
我發現漢字的高位時負的,如何得到正的值?
uj5u.com熱心網友回復:
比如:情景如下:
{
記憶體某處32位資料
0000 0001, 0000 0000, 0000 0000, 1000 0000
其中1這里正是地址0x12345678
}
char *p_c = 0x12345678;
unsigned char *p_uc = 0x12345678;
int *p_i =0x12345678;
此時兩個指標是相等的。值相同,記錄的地址都一樣,都是0x12345678
---------------------------------
現在取值:
char a1 = *p_c;//首先看char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
unsigend char a2 = *p_c;//首先看unisgned char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
int a3 = *p_i;//首先看int是四個位元組,所以只取0x12345678開始的4個位元組。即取到0 000 0001,0000 0000,0000 0000,1000 0000
----------------------------------
最后,a1和a2在記憶體中的值是一模一樣的。只不過a1是被作為char進行解讀的,a2是被作為unsigned char被解讀的。
a3的值 為-1。(不過這也得看什么大端小端存盤的東西)
uj5u.com熱心網友回復:
比如:
情景如下:
{
記憶體某處32位資料
0000 0001, 0000 0000, 0000 0000, 1000 0000
其中1這里正是地址0x12345678
}
char *p_c = 0x12345678;
unsigned char *p_uc = 0x12345678;
int *p_i =0x12345678;
此時兩個指標是相等的。值相同,記錄的地址都一樣,都是0x12345678
---------------------------------
現在取值:
char a1 = *p_c;//首先看char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
unsigend char a2 = *p_c;//首先看unisgned char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
int a3 = *p_i;//首先看int是四個位元組,所以只取0x12345678開始的4個位元組。即取到0 000 0001,0000 0000,0000 0000,1000 0000
----------------------------------
最后,a1和a2在記憶體中的值是一模一樣的。只不過a1是被作為char進行解讀的,a2是被作為unsigned char被解讀的。
a3的值 為-1。(不過這也得看什么大端小端存盤的東西)
我想說的是
比如:
情景如下:
{
記憶體某處32位資料
0000 0001, 0000 0000, 0000 0000, 1000 0000
其中1這里正是地址0x12345678
}
char *p_c = 0x12345678;
unsigned char *p_uc = 0x12345678;
int *p_i =0x12345678;
此時兩個指標是相等的。值相同,記錄的地址都一樣,都是0x12345678
---------------------------------
現在取值:
char a1 = *p_c;//首先看char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
unsigend char a2 = *p_c;//首先看unisgned char是一個位元組,所以只取0x12345678開始的1個位元組。即取到0 000 0001。
int a3 = *p_i;//首先看int是四個位元組,所以只取0x12345678開始的4個位元組。即取到0 000 0001,0000 0000,0000 0000,1000 0000
----------------------------------
最后,a1和a2在記憶體中的值是一模一樣的。只不過a1是被作為char進行解讀的,a2是被作為unsigned char被解讀的。
a3的值 為-1。(不過這也得看什么大端小端存盤的東西)
干寫大神
我想這樣
記憶體中有一塊存盤區域,new出來的
然后memcpy 一個位元組到一個char型或者unsigned char變數,假設是c
然后再判斷c的十進制值
我發現我memcpy半個漢字到c時,實際值時負數,我需要正數,才能是否在GBK編碼范圍內。
謝謝
uj5u.com熱心網友回復:
char str[] = "哈哈1你好23";
char* p = str;
while (*p != '\0')
{
char hz[3] = { 0 };
if (*p&0x80)
{
hz[0] = *p;
printf("高位編碼:%x|", (*p)&0x000000ff);
p++;
hz[1] = *p;
printf("底位編碼:%x ", (*p)&0x000000ff);
printf("\t字符:%s\n", hz);
}
else
{
printf("編嗎:%x \t 字符: %c\n", *p, *p);
}
p++;
}
uj5u.com熱心網友回復:
const char *s = "中";unsigned char c;
memcpy(s,&c,sizeof(c));
uj5u.com熱心網友回復:
const char *s = "中";
unsigned char c;
memcpy(s,&c,sizeof(c));
大神,您的代碼好像時把unsigned copy到一個char里去
我應該時想把char copy到 unsigned char
因為我的目的是要獲取 一個位元組的正值,比如漢字的高位位元組的十進制正值
uj5u.com熱心網友回復:
const char *s = "中";
unsigned char c;
memcpy(s,&c,sizeof(c));
大神好,我說簡單點把
new了一塊記憶體m,fread了一些資料到m
假設m的第一和第二個位元組是漢字“好”
我需要獲取“好”的高位位元組和低位位元組的十進制正值,依次來判斷是否是否是漢字。也就是是否在GBK的漢字編碼范圍內
uj5u.com熱心網友回復:
‘好’::BAC3(GBK)char* m;
.....讀取
if(*m == BA&&*(m+1)==C3)
printf("是GBK好的編碼");
//我覺得應該是這樣的吧,并沒有運行
uj5u.com熱心網友回復:
‘好’::BAC3(GBK)
char* m;
.....讀取
if(*m == BA&&*(m+1)==C3)
printf("是GBK好的編碼");
//我覺得應該是這樣的吧,并沒有運行
謝謝大神,不能獲取漢字的高位和低位位元組的十進制正數嗎?
uj5u.com熱心網友回復:
如果想搞位運算,就學習一些位運算的知識:char* m
char T = *m;//此時,T就是m的第一個位元組。
你要看T的第一位,
if(T&127)
就能判斷出來了
uj5u.com熱心網友回復:
char T = 0x??int a = (int)T;//試試行不
不行就試試
if(T<0)
T+=256;
int a = T;
uj5u.com熱心網友回復:
char:范圍-128~127。樓主應該多了解一下,這從-128到+127在記憶體中的關系
也就是補碼這個東西。
以及符號位。
同樣一個記憶體 1個位元組,比如: 1111 1111
把它當作char來使用的時候,值為-1。
但若你將它視作unsigned char來使用的時候,值為255。
所以為什么有判斷
if(T<0)
256+T。就是這么來的//256+(-1) = 255
uj5u.com熱心網友回復:
char c;if(c&0x80)
{
漢字
}
else
ascii 碼
uj5u.com熱心網友回復:
char c;
if(c&0x80)
{
漢字
}
else
ascii 碼
謝謝,if(c&0x80)是啥意思啊?
為啥判斷一個位元組就能判斷是漢字?難道不應該判斷兩個位元組嗎?
uj5u.com熱心網友回復:
char str[] = "哈哈1你好23";
char* p = str;
while (*p != '\0')
{
char hz[3] = { 0 };
if (*p&0x80)
{
hz[0] = *p;
printf("高位編碼:%x|", (*p)&0x000000ff);
p++;
hz[1] = *p;
printf("底位編碼:%x ", (*p)&0x000000ff);
printf("\t字符:%s\n", hz);
}
else
{
printf("編嗎:%x \t 字符: %c\n", *p, *p);
}
p++;
}
uj5u.com熱心網友回復:
char c;
if(c&0x80)
{
漢字
}
else
ascii 碼
謝謝,if(c&0x80)是啥意思啊?
為啥判斷一個位元組就能判斷是漢字?難道不應該判斷兩個位元組嗎?
你的有些問題,個人感覺體現出你在不少方面學習得還不夠深入,所以對你造成了障礙。
你可以考慮學習或重溫一下:補碼、符號位、編碼、c語言位操作、指標這些(這兩個可以考慮進行寫代碼練習)。學習一下除錯,打斷點,看記憶體。
如果你確信你的理論知識是有印象的,那你就差一點點練習,練習一下。打個斷點,看看記憶體的存盤,先看char的記憶體。再看指標的記憶體,再看純英文字串的記憶體,再看混合的記憶體。
uj5u.com熱心網友回復:
char c;
if(c&0x80)
{
漢字
}
else
ascii 碼
大神好,這段代碼我這么理解可以嗎?
如果判的是高位元組的最高位=1,那么是和漢字
但是GBK編碼漢字低位位元組的最高位也可能是1
uj5u.com熱心網友回復:
發現一個高位為一的位元組,按漢字讀取,因為漢字是兩個位元組,因此一次都兩個,就不用管他下一個位元組的高位到底是1還是0uj5u.com熱心網友回復:
發現一個高位為一的位元組,按漢字讀取,因為漢字是兩個位元組,因此一次都兩個,就不用管他下一個位元組的高位到底是1還是0
問題出在,我是從字串的右邊開始往左邊回溯的
比如 “好A”我是從A開始往左邊判斷,就不對了
如果從“好”開始往右邊判斷,那么沒問題
如果從右邊往左邊移動判斷,完全可能A和“好”的低位位元組也是構成 一個漢字的
uj5u.com熱心網友回復:
稍微百度一下就有很詳細的解釋非要跑來這里提個問,做任務?uj5u.com熱心網友回復:
有符號和無符號的區別uj5u.com熱心網友回復:
發現一個高位為一的位元組,按漢字讀取,因為漢字是兩個位元組,因此一次都兩個,就不用管他下一個位元組的高位到底是1還是0
問題出在,我是從字串的右邊開始往左邊回溯的
比如 “好A”我是從A開始往左邊判斷,就不對了
如果從“好”開始往右邊判斷,那么沒問題
如果從右邊往左邊移動判斷,完全可能A和“好”的低位位元組也是構成 一個漢字的
從右往左,你可以先讀取完畢后在處理啊?
uj5u.com熱心網友回復:
本質上來講,uc指標和char指標都是指向一個BYTE空間的指標,沒有區別,數值上指標都是地址值,也沒有區別。只是指向的這一個位元組的空間里,存的是有符號資料,還是無符號資料。uj5u.com熱心網友回復:
從今天開始,初五準備一天三更,求大家的收藏和推薦哈!12點,17點,20點,準時三更!uj5u.com熱心網友回復:
在windowsAPI上,這是兩個型別,一個是LPBYTE,另一個是不太常用的char*。uj5u.com熱心網友回復:
ascii字符集只使用7位編碼,對第八位的處理沒有約定,由各系統實作廠商自行定義。雙位元組編碼則使用16位完全編碼并且預留一些空號(系統保留)占位。byte* 和char* 的設計,可能與系統對編碼系統的空號處理有關。uj5u.com熱心網友回復:
指標,存盤的是指向物件(常量,變數,函式,陣列等)的型別。指標的型別是指向物件的型別,并不是本身地址的型別。
uj5u.com熱心網友回復:
無符號可以表示更大的正整數,有符號的可以表示負數和正整數,但是正整數的范圍相應也會小一半uj5u.com熱心網友回復:
無符號可以表示更大的正整數,有符號的可以表示負數和正整數,但是正整數的范圍相應也會小一半uj5u.com熱心網友回復:
無符號可以表示更大的正整數,有符號的可以表示負數和正整數,但是正整數的范圍相應也會小一半uj5u.com熱心網友回復:
指標指向的資料型別不一樣。指標就是資料存放的地址,unsigned char 指標指向的資料型別為unsigned char 型,char 指標指向的資料型別為char 型。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98900.html
標籤:C++ 語言
