| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 887 人关注过本帖
标题:关于避免 输入几个f 代表全 1 的 就是0xffff.......啥的 看看这个办法可行 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:100 回复次数:8 
关于避免 输入几个f 代表全 1 的 就是0xffff.......啥的 看看这个办法可行乎
程序代码:
#include <stdio.h>

//计算cpu字长
int c_get_cpu_lenth()
{
    unsigned int a;
    int i;
    a=~0;
    i=1;
    while((a>>=1)!=0) ++i;
    return i;
}

//计算2^N
unsigned int c_get_half_one()
{
    unsigned int t=1;
    for(int i=1;i<=c_get_cpu_lenth()/2;i++) t*=2u;
    return t-1;
}

int main()
{
    long test = 10*61380;
    long tl = test & c_get_half_one(); //获取整数的低16位 或者低X位  这里就不用0xffff 了  以避免弄错 可行?
    printf("L16=%X\n",tl);
    return 0;
}

搜索更多相关主题的帖子: return 
2015-12-01 14:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:30 
实话说,不能理喻。
c_get_cpu_lenth可以直接return sizeof(int)*8

能编个毛线衣吗?
2015-12-01 14:15
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:20 
楼上说的是
2015-12-01 14:17
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 2楼 wmf2014
为啥是乘以8呢

DO IT YOURSELF !
2015-12-01 14:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:50 
以下是引用wp231957在2015-12-1 14:19:09的发言:

为啥是乘以8呢
因为一个字节有8bits。
C标准中没有强制规定,但可以这么理解
The sizeof operator yields the size (in bytes) of its operand, …………
When sizeof is applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1. …………
— number of bits for smallest object that is not a bit-field (byte)
   CHAR_BIT                                             8
即:sizeof返回字节数,一字节是8bits

你的 c_get_cpu_lenth 可以直接用常数 sizeof(unsigned int)*8
你的 c_get_half_one 可以直接用常数 (1u<<sizeof(unsigned int)*8/2)-1

2015-12-01 15:02
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 5楼 rjsp
64位cpu 中  sizeof int ==8  

没有64位cpu 瞎猜

DO IT YOURSELF !
2015-12-01 15:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用wp231957在2015-12-1 15:11:22的发言:

64位cpu 中  sizeof int ==8  
 
没有64位cpu 瞎猜
64位时,有些不愉快的地方
按道理 sizeof(long long) >= sizeof(long) >= sizeof(int) >= sizeof(short),且int应该是64bits
但是这样一来,short是32bits呢,还是16bits?不管是哪个,都有一个无法表示了。
所以要么忍痛丢掉16/32中的一个,要么让int不是64bits。

先给你看个表
Data Type  ILP32  LLP64  LP64  ILP64
char        8      8      8     8
short      16     16     16    16
int        32     32     32    64
long       32     32     64    64
long long  64     64     64    64
pointer    32     64     64    64
GCC默认使用LP64数据模型
VC默认使用LLP64数据模型
但是,都可以通过编译参数进行修改。

2015-12-01 15:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
不可否认的是,C语言诞生得太早,好多情况没能预料到。
假如重新设计的话,对于整型,应该这样:
int8、uint8、int16、uint16、int32、uint32、int64、uint64、……
这样就可以避免升级引发的混乱。当然,仅仅这些还不够,比如int16类型的一系列数 在32位CPU上运算,效率就不高,因为中间每一步都要做一个无意义的截断到16bits的操作,因此还得增加
int8least、uint8least、int16least、uint16least、int32least、uint32least、int64least、uint64least、……
也就是加了least结尾的表示:我不管你实际是多少位,只要你能保证至少有我指定的位数就行了,这样一来,既能满足我的要求,你编译器又可能使用最高效的运算类型。

事实上,C语言也正在这样变化,就是标准库中的<stdint.h>文件
比如 uint16_t 就表示一个 16bits的无符号整型
uint_least16_t 就表示一个至少16bits的无符号整型,编译器可能实际使用32bits或64bits的无符号类型进行优化
2015-12-01 16:17
快速回复:关于避免 输入几个f 代表全 1 的 就是0xffff.......啥的 看看这个办 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045095 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved