時間格式化輸出 / unsigned char 與 char 本質區別?

 1 #include <time.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int main(void)
 6 {
 7         struct tm *local;
 8         time_t t;
 9         t=time(NULL);
10         local=localtime(&t);
11         printf("Local hour is: %02x\n",local->tm_hour);
12         printf("Local month is: %02x\n",local->tm_mon);
13         printf("Local wday is: %02x\n",local->tm_wday);
14         printf("Local year is: %d\n",local->tm_year);
15         //local=gmtime(&t);
16         //printf("UTC hour is: %d\n",local->tm_hour);
17 
18 
19         printf(asctime(local));
20 
21         unsigned char tmpbuf[8];  //  如果char 類型,2017輸出結果則爲ffffffe1 07
22         memset(tmpbuf,0,sizeof(tmpbuf));
23 
24         local->tm_year = local->tm_year + 1900;
25 
26         printf("Print the current year is %d \n",local->tm_year);
27 
28         unsigned char year[2];//  如果char 類型,2017輸出結果則爲ffffffe1 07
29      memset(year,0,sizeof(year));
30       memcpy(year,&local->tm_year,2); //將佔4個byte的int型轉化成兩個byte的char類型輸出;



printf("Print the year %02x %02x %02x %02x \n",year[0],year[1],year[0],year[1]);



sprintf(tmpbuf,"%c%c%c%c%c%c%c%c",year[0],year[1],local->tm_mon,local->tm_mday,

local->tm_hour,local->tm_min,local->tm_sec,local->tm_wday);

int i =0;



for(i = 0;i < 8;i++)

{

printf("%02x ",tmpbuf[i]);
}
return 0;
}

 

在標準C/C++中,咱們可經過tm結構來得到日期和時間,tm結構在time.h中的定義以下:

#ifndef _TM_DEFINED
struct tm {
          int tm_sec;       /* 秒 – 取值區間爲[0,59] */
          int tm_min;       /* 分 - 取值區間爲[0,59] */
          int tm_hour;      /* 時 - 取值區間爲[0,23] */
          int tm_mday;      /* 一個月中的日期 - 取值區間爲[1,31] */
          int tm_mon;       /* 月份(從一月開始,0表明一月) - 取值區間爲[0,11] */
          int tm_year;      /* 年份,其值等於實際年份減去1900 */
          int tm_wday;      /* 星期 – 取值區間爲[0,6],其中0表明星期天,1表明星期一,以此類推 */
          int tm_yday;      /* 從每一年的1月1日開始的天數 – 取值區間爲[0,365],其中0表明1月1日,1表明1月2日,以此類推 */
          int tm_isdst;     /* 夏令時標識符,實行夏令時的時候,tm_isdst爲正。不實行夏令時的進候,tm_isdst爲0;不瞭解狀況時,tm_isdst()爲負。*/
          };
#define _TM_DEFINED
#endif 網絡

 

 

gcc test.c -o testspa

 

./test執行後,結果:code

 

debian:/home/zhangling# ./test
Local hour is: 0a
Local month is: 03
Local wday is: 01
Local year is: 117
Mon Apr 17 10:14:41 2017
Print the current year is 2017
Print the year e1 07 e1 07
e1 07 03 11 0a 0e 29 01blog

 

但若代碼中,內存

unsigned char tmpbuf[8];//  如果char 類型,2017輸出結果則爲ffffffe1 07
unsigned char year[2];//  如果char 類型,2017輸出結果則爲ffffffe1 07

 

char和unsigned char的本質區別:【有待繼續加深理解.......................】it

首先在內存中,char與unsigned char沒有什麼不一樣,都是一個字節,惟一的區別是,char的最高位爲符號位,所以char能表示-128~127, unsigned char沒有符號位,所以能表示0~255,這個好理解,8個bit,最多256種狀況,所以不管如何都能表示256個數字。io

在實際使用過程種有什麼區別呢?class

主要是符號位,可是在普通的賦值,讀寫文件和網絡字節流都沒什麼區別,反正就是一個字節,無論最高位是什麼,最終的讀取結果都同樣,只是你怎麼理解最高位而已,在屏幕上面的顯示可能不同。test

可是咱們卻發如今表示byte時,都用unsigned char,這是爲何呢?gcc

首先咱們一般意義上理解,byte沒有什麼符號位之說,更重要的是若是將byte的值賦給int,long等數據類型時,系統會作一些額外的工做。

若是是char,那麼系統認爲最高位是符號位,而int多是16或者32位,那麼會對最高位進行擴展(注意,賦給unsigned int也會擴展)

而若是是unsigned char,那麼不會擴展。

這就是兩者的最大區別。

相關文章
相關標籤/搜索