久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2381|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

為什么1<<17無法得到0x020000?C語言程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71233 發(fā)表于 2023-8-15 08:05 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
在在keil C51中,想用1<<17來得到0x020000,可是無法得到這樣的結(jié)果。想得到常數(shù)0x020000,只能使用宏定義:#define T17 0x020000
因C水平有限,不知道是什么原因,請(qǐng)各位大佬賜教,謝謝!


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

13#
ID:962286 發(fā)表于 2023-8-17 10:31 | 只看該作者
lmn2005 發(fā)表于 2023-8-15 16:21
有定義過,即
unsigned long i;
i=1

它是先計(jì)算1<<17,再將結(jié)果賦值到變量i,所以還是回到最先的問題來,最終也是錯(cuò)誤。要寫成:
i = 1;
i <<= 17;
不過如果是常量,就沒必要浪費(fèi)RAM空間了。直接 (1UL << 17)
回復(fù)

使用道具 舉報(bào)

12#
ID:1034262 發(fā)表于 2023-8-15 16:56 | 只看該作者
C51默認(rèn)是16位的常數(shù),要指定或強(qiáng)轉(zhuǎn)32位,
1UL << 17
(u32)1 << 17
回復(fù)

使用道具 舉報(bào)

11#
ID:71233 發(fā)表于 2023-8-15 16:24 | 只看該作者
ydatou 發(fā)表于 2023-8-15 11:45
經(jīng)驗(yàn)證,13行定義不行。
11行 12行定義都可以。11行定義是通用的做法。

謝謝!用11行最簡單好用!
回復(fù)

使用道具 舉報(bào)

10#
ID:71233 發(fā)表于 2023-8-15 16:21 | 只看該作者
chxelc 發(fā)表于 2023-8-15 09:01
從計(jì)算結(jié)果來看,1

有定義過,即
unsigned long i;
i=1<<17;
也無法解決問題
回復(fù)

使用道具 舉報(bào)

9#
ID:71233 發(fā)表于 2023-8-15 16:19 | 只看該作者
本帖最后由 lmn2005 于 2023-8-15 16:34 編輯

試了這種寫法,可以解決問題,謝謝!
回復(fù)

使用道具 舉報(bào)

8#
ID:883242 發(fā)表于 2023-8-15 13:59 | 只看該作者

你的解釋是正確的,但是解決方案并不好,
unsigned long result
這句話就占用了4個(gè)字節(jié)的RAM空間,MCS-51這個(gè)體系太落后了,直接尋址能力只有128 bytes,寸土寸金的地方一下子消耗掉4 bytes太浪費(fèi)。
改成
#define T17 0x20000UL
最后消耗的是code空間,反正這個(gè)空間足夠大,多消耗十幾個(gè)字節(jié)都可以忽略不計(jì)。
回復(fù)

使用道具 舉報(bào)

7#
ID:1053359 發(fā)表于 2023-8-15 12:44 | 只看該作者
在Keil C51中,使用1 << 17 來得到 0x020000 是行不通的。這是因?yàn)樵贑語言中,1 是一個(gè)整型常量,默認(rèn)是32位的,而在C51中,整型默認(rèn)是16位的。所以左移17位將會(huì)導(dǎo)致溢出。

要得到 0x020000 這個(gè)常數(shù),你可以使用宏定義,像你提到的那樣:
#define T17 0x020000
通過這種方式,你可以在代碼中使用 T17 來代表常數(shù) 0x020000。
另外,如果你需要使用 1 << 17 進(jìn)行移位操作,你可以使用長整型進(jìn)行計(jì)算,然后截取需要的位數(shù)。例如:
unsigned long result = 1UL << 17;
unsigned int finalResult = (unsigned int)(result & 0xFFFF);
上述代碼中,首先使用 unsigned long 類型接收移位結(jié)果,然后再使用 unsigned int 類型接收結(jié)果的低16位(0x20000 & 0xFFFF),即 0x0000FFFF。這樣你就可以得到想要的結(jié)果。
回復(fù)

使用道具 舉報(bào)

6#
ID:1073939 發(fā)表于 2023-8-15 11:45 | 只看該作者


經(jīng)驗(yàn)證,13行定義不行。
11行 12行定義都可以。11行定義是通用的做法。
回復(fù)

使用道具 舉報(bào)

5#
ID:1073939 發(fā)表于 2023-8-15 11:35 | 只看該作者
#define T17 (1L<<17)

這是正確的定義
回復(fù)

使用道具 舉報(bào)

地板
ID:939553 發(fā)表于 2023-8-15 10:54 來自手機(jī) | 只看該作者
(unsigned long)1 << 17
回復(fù)

使用道具 舉報(bào)

板凳
ID:190832 發(fā)表于 2023-8-15 09:15 | 只看該作者
51是8位單片機(jī),1<<17的1是16位的,左移17位就只剩0了。
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:712097 發(fā)表于 2023-8-15 09:01 | 只看該作者
從計(jì)算結(jié)果來看,1<<17=131072=0x020000沒問題呀,是不是數(shù)據(jù)類型定義不對(duì)呀,用unsigned long類型試一下。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久冷 | 国内av在线 | 天天色综| 欧美在线a| 日韩有码一区二区三区 | 久久久久久久一区 | 精品99在线 | 欧美精品一区二区三区蜜桃视频 | 人人玩人人添人人澡欧美 | 99精品视频一区二区三区 | 久久久噜噜噜www成人网 | 97精品国产 | 国产精品久久久久久久久久久久午夜片 | 一区二区福利视频 | 看一级毛片视频 | 日本黄视频在线观看 | 国产高清av免费观看 | 日韩精品在线观看一区二区 | 国产96色在线 | 免费亚洲视频 | 激情自拍偷拍 | 久久精品国产久精国产 | 精品九九久久 | 91精品久久久久久久99 | 国产精品美女久久久久久免费 | 日日操操操 | 欧美人人 | 日韩亚洲一区二区 | 亚洲免费一区 | 日韩美女一区二区三区在线观看 | 日韩精品四区 | 久久久高清 | 麻豆视频国产在线观看 | 中文字幕 欧美 日韩 | 天天澡天天狠天天天做 | 成人精品高清 | 欧美精品久久久久久 | 国产欧美一区二区三区久久手机版 | 91精品国产91久久久久青草 | 一区二区国产在线观看 | 久久一|