C语言 有/无符号数 需要注意的问题
来源:互联网 发布:最好的桌面主题软件 编辑:程序博客网 时间:2024/04/30 08:36
关于溢出问题:
- 无符号数的溢出: 其实是指发生绕回,最大的数加1即最小.也就是结果对2^n取模.
- 有符号数的溢出: 结果不固定,会舍弃高位,影响正负位.
编译器采取的策略是: 不对此处理,不负责这种溢出. - ps: 溢出会导致很多隐藏的问题,具体参考最后的网址.
类型转换问题:
ANSI C规定在无符号整数和有符号整数之间进行强制类型转换时,位模式不应该改变。类型转换并未改变对象的位模式,改变的是位模式的解释方式,也就是: (简单地说, 编译器不管你, 它只负责解释.)
- 有符号数转换为无符号数时,负数转换为大的正数(可以理解为原值加上2的n次方),而正数保持不变。
- 无符号数转换为有符号数时,对于小的数将保持原值,对于大的数则转换为负数(可以理解为原值减去2的n次方)。
例子:
if(i-j>=0) 假如i,j为无符号数,这样写可能会引发错误,即当i小于j的时候,这个式子仍然成立,因为无符号数始终是大于等于零的。
例:if(strlen(a)>=10) 与 if(strlen(b)-10>=0)这两条语句是不相等的 ,因为strlen函数返回的是无符号数类型。
类型转换规则:
小于int的提升到int,int之后都是从signed -> unsigned
对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了.
一定要记住如果需要使用有符号数时不要忘记强制转换
参考:
http://coolshell.cn/articles/11466.html
ps: 本文并非纯原创, 是参考了几篇文章综合而来, 谢谢互联网大牛们分享.
ps: 初学计算机,有任何不规范,不准确的细节,尽管提出!一起讨论下.
1 0
- C语言 有/无符号数 需要注意的问题
- 有关C语言中有符号/无符号数混合运算的小问题
- 有关C语言中有符号/无符号数混合运算的小问题
- 有关C语言中有符号/无符号数混合运算的小问题
- 无符号数与有符号数比较大小时注意的一个问题
- 无符号数与有符号数比较大小时注意的一个问题
- C语言中的无符号数和有符号数
- C语言中的有符号数与无符号数
- c语言中的有符号数和无符号数
- C语言中无符号数和有符号数相加问题
- C语言中的无符号数与有符号数混合运算时隐含转换问题
- C语言中的无符号数与有符号数混合运算时隐含转换问题
- C语言中无符号数和有符号数相加问题 .
- C语言中无符号数和有符号数相加问题
- C语言中无符号数和有符号数相加问题
- 注意sizeof()返回的数无符号数,有符号数遇到无符号数时变成无符号数
- C语言中有符号数和无符号数的比较
- C语言有符号数与无符号数之间的转换
- Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
- 案例学习: MapReduce
- 简易HTTP服务器的实现
- MySQL relay_log_purge=0 时的风险
- 在android中通过java层程序调用命令行的一些备注
- C语言 有/无符号数 需要注意的问题
- bzoj 3206: [Apio2013]道路费用 最小生成树
- 动态规划之最少硬币
- margin与padding
- MATLAB数据处理快速学习教程
- 记于2016.4.6
- NSInvocation在获取返回值后crash问题
- 【有毒的设计模式】模板方法模式
- C#实例之聊天机器人