會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
mplab ide v8.92, mcc18 v3.42,mcu pic1845k80
unsigned int uns16_temp_g;
unsigned char uns8_temp1_g;
uns16_temp_g=12500;
uns8_temp1_g=99;
uns8_temp1_g=uns16_temp_g/uns8_temp1_g;
以上計算結果錯誤

以下列方式計算則正確
uns8_temp1_g=12500/99;

請問這是怎麼回事?

2016/02/01 16:49
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 943
等級: 27; EXP: 31
HP : 0 / 657
MP : 314 / 19959
離線
應該是要(強制)型別轉換...

uns8_temp1_g=uns16_temp_g/uns8_temp1_g;
uns8_temp1_g=(unsigned char)(uns16_temp_g/uns8_temp1_g);

2016/02/02 08:24
_________________
程式是
依照寫出來(的code),跑出結果
不是依照你想出來的,得到結果

先有需求規格 後有解決方案
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
這不行吧uns16_temp_g是16bits,強制轉換為unsigned char會使高八位元資料遺失,計算結果也是不正確,那為何12500/99計算結果是正確的?

2016/02/02 08:57
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 252
等級: 14; EXP: 84
HP : 0 / 346
MP : 84 / 7364
離線
我用 C18 V3.47來實驗

程式如下:
unsigned int uns16_temp_g;
unsigned char uns8_temp1_g;
void main(void)
{

uns16_temp_g=12500;
uns8_temp1_g=99;
uns8_temp1_g=uns16_temp_g/uns8_temp1_g;
Nop(); //<--斷點在這
while(1)
{

}
}

從watch看到的答案是:
uns8_temp1_g = 126;

以上實驗完畢。

2016/02/02 09:48
_________________
除役的胖子FAE
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
我也更新到3.47版,重新定義變數型態
unsigned int=unsigned int/unsigned int
int=int/int
以上兩個結果都是12500(12500/99)

char=int/char
結果為-44

unsigned char=int/unsigned char
unsigned char=unsigned int/unsigned char
以上兩個結果為212

以前我也沒遇過這種怪事

2016/02/02 09:59
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 158
等級: 11; EXP: 62
HP : 0 / 265
MP : 52 / 6634
離線
這個原因不是太難...
應該只是你太累了而已.

注意看!

char=int/char
結果為-44 ===>> 0xD4


unsigned char=int/unsigned char
unsigned char=unsigned int/unsigned char
以上兩個結果為212 ===>> 0xD4

-----------------------------------------
char 數值範圍 -128 ~ 127

所以囉!

2016/02/02 11:35
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
引用:

OuO... 寫道:
這個原因不是太難...
應該只是你太累了而已.

注意看!

char=int/char
結果為-44 ===>> 0xD4


unsigned char=int/unsigned char
unsigned char=unsigned int/unsigned char
以上兩個結果為212 ===>> 0xD4

-----------------------------------------
char 數值範圍 -128 ~ 127

所以囉!


12500/99=126才對吧 更何況是unsigned char,其範圍應該是0~255

2016/02/02 13:19
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
將介面改至mplab x及xc8,就沒問題了,感謝各位的回覆

2016/02/02 14:24
轉換PDF檔 列印


Re: pic18f45k80 and mcc18
資深會員
註冊日期:
2004/06/10 11:45
所屬群組:
註冊會員
文章: 191
等級: 12; EXP: 86
HP : 0 / 296
MP : 63 / 11590
離線
找到原因了,要將configuration bits的
XINST: Extended Instruction Set Enable bit
1 = Instruction set extension and Indexed Addressing mode are enabled
0 = Instruction set extension and Indexed Addressing mode are disabled (Legacy mode)

XINST要設為0就可以正確執行了,其default值為1

2016/02/02 15:11
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
2017 Summer Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project