c/c++常见类型转换错误

文章目录

    • char转int 高位符号扩展
    • 有符号int与无符号int比较
    • 关于一个bit的位域变量的取值范围
    • 临时变量溢出
    • size_t死循环

char转int 高位符号扩展

int main() {char a = 0x9A;int util;util = (int)a;cout << a << endl;cout << util << endl;if (util > 0) {std::cout << "pos" << std::endl;} else {std::cout << "neg" << std::endl;}
}

打印结果:


-102
neg

0x9A转换为十进制为154,所以,在把a强制转换为int类型的变量util之后以为还是154,所以,期望输出为“positive”。但实际上0x9A的二进制表示为10011010,在强制转换为int时,因为int是有符号的,需要对10011010进行符号扩展,也就是用其最高位1来扩充其他 3个高字节,变成 11111111 1111111111111111 10011010(假设 int是4个字节),而这个是负数-102的二进制补码表示。所以,在判断util是否小于0时就会输出“negative”。

正确做法:

int main() {char a = 0x9A;int util;util = (int)(unsigned char)a;cout << a << endl;cout << util << endl;if (util > 0) {std::cout << "pos" << std::endl;} else {std::cout << "neg" << std::endl;}
}

如果期望 0x9A为正数,实际上需要先把 a强制转换为unsigned char。这样0x9A才会被解析为154

有符号int与无符号int比较

int main() {int d = -1;int array[] = {23, 23, 23};cout << d << endl;cout << (unsigned int)d << endl;cout << (sizeof(array) / sizeof(array[0])) << endl;if (d < (sizeof(array) / sizeof(array[0]))) {cout << "yes" << endl;} else {cout << "no" << endl;}return 0;
}

结果:

-1
4294967295
3
no

由于sizeof()的返回类型是无符号整型

if语句在比较signed int型变量d和unsignedint型值的时候,signed int型变量被转换为 unsigned int型变量。-1转换成 unsigned int的结果是一个非常巨大的正整数(在 32位操作系统上会转换成2^32-1),导致if判断为假。

正确的做法:sizeof返回的结果强制转换为int型。

int main() {int d = -1;int array[] = {23, 23, 23};cout << d << endl;cout << (unsigned int)d << endl;cout << (sizeof(array) / sizeof(array[0])) << endl;if (d < (int)(sizeof(array) / sizeof(array[0]))) {cout << "yes" << endl;} else {cout << "no" << endl;}return 0;
}
-1
4294967295
3
yes

关于一个bit的位域变量的取值范围

typedef struct xxdata {int flag: 1;int other: 31;
} xxdata;
int status() {return 1;
}
int main() {xxdata test;test.flag = status();if (test.flag == 1) {cout << "test.flag = 1" << endl;} else {cout << "test.flag != 1" << endl;}
}
test.flag != 1

在结构体中定义了一个int型的位域变量,而用一个bit来表示int时,这一位是用来表示符号位的,

带符号的一个bit的位域变量的取值范围是0或-1(无符号的一个bit的位域变量的取值范围是0或1)

stauts()的返回值1赋给flag时会出现溢出,flag值变为-1

下面的判断-1就可以:

typedef struct xxdata {int flag: 1;int other: 31;
} xxdata;
int status() {return -1;
}
int main() {xxdata test;test.flag = status();if (test.flag == -1) {cout << "test.flag = -1" << endl;} else {cout << "test.flag != -1" << endl;}
}
test.flag = -1

临时变量溢出

long mul(int m, int n) {long score;score = m * n;return score;
}

在64位操作系统下,int型通常占4个字节,long型通常占8个字节,两个int型变量相乘的值范围是long型变量的值范围。score=m*n 这行代码在执行时,m和n相乘的结果会先存储在一个临时的int变量中,然后再赋值给long变量score,这个临时变量是很容易溢出的。所以,需要在表达式运算前先对m和n做数据类型转换。

正确做法:

long mul(int m, int n) {long score;score = static_cast<long>(m) * static_cast<long>(n);return score;
}

对隐式的类型转换,一般来说向上是安全的,向下会出现数据截断丢失,导致数据错误。事实上,上述正确代码只在long型字节数是int型字节数两倍的情况下才是正确的,如果在某些平台下,long 型和int 型字节数一样的话(如32 位操作系统int型和long型通常都占4个字节),仍然需要注意两个int型相乘结果溢出的问题。

size_t死循环

int main() {size_t size = sizeof(int);cout << size << endl;while (--size >= 0) {cout << "size = " << size << endl;}return 0;
}

while条件永远为真,程序进入死循环

size_t是 sizeof操作符返回的结果类型,size_t在32位系统中是unsigned int,在 64位系统中是 unsigned long int。

当size的值等于0并再次作−−size运算时,size会因溢出再次等于它取值范围内的最大值,所以,size的值恒大于等于0

正确做法:

1、修改while条件

while (--size > 0) {if (size == 0) break;
}

2、使用int替代size_t

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript 装载和执行

一两个月前在淘宝内网里看到一个优化Javascript代码的竞赛&#xff0c;发现有不少的人对Javascript的执行和装载的基础并不懂&#xff0c;所以&#xff0c;从那天起我就想写一篇文章&#xff0c;但一直耽搁了。 首先&#xff0c;我想说一下Javascript的装载和执行。通常来说&am…

java sundry tips

1.关于Arrays 记得binarySearch方法返回的int 类型的数值的含义。 If the array contains multiple elements with the specified value, there is no guarantee which one will be found. 而且当查找数小于数组中任何一个数时返回-1 &#xff0c;当查找数大于数组中任何…

c++常见的10个类对象问题

文章目录1、对象的浅复制2、构造函数中的操作符重载3、拷贝构造函数不能模板化4、析构函数未捕获异常导致coredump5、构造函数抛出异常6、基类析构函数非虚导致内存泄漏7、删除void*指针引发内存泄露8、成员函数尾部缺失const9、使用memset初始化class10、对象向下转换失败1、对…

Ubuntu 14.10 -- 异次元软件世界

Ubuntu 14.10 中文桌面版/服务器正式版下载 - 华丽免费易于入门的 Linux 操作系统 [ 系统工具 - Linux // 2014-10-25 ]一说到 Linux&#xff0c;就不得不提目前最红火的 Ubuntu 发行版了&#xff01;它拥有绚丽的界面&#xff0c;甚至跟以时尚为卖点的 Mac OSX 相比也有过之而…

maven 概念

这里maven倡导约定优于配置&#xff0c;maven的约定就是以下目录结构src/main/java 下存放java类src/main/webapp 下存放页面文件(需要手动创建)src/main/resources 下存放资源文件src/test/java 下存放单元测试代码src/test/resources 下存放测试资源文件 Maven运行的生命周期…

System Design笔记:在线售票系统设计

文章目录何为在线售票系统&#xff1f;系统目标和要求1、功能要求2、非功能性需求3、设计注意事项4、容量估算5、系统API1.SearchMovies2.ReserveSeats6、数据库设计7、高级设计8、细节模块设计9、流程服务器如何跟踪所有尚未预订的active预订&#xff1f;服务器如何跟踪所有等…

Response.Write具体介绍

问题一&#xff1a; Response.Write 后连接Response.Redirect &#xff0c;则Response.Write无法显示&#xff0c;直接跳转入Response.Redirect 的页面。 解决方案&#xff1a; Response.Write("<script langugejavascript>alert(成功改动); window.location.hrefin…

SharePoint通过IP地址访问

问题&#xff1a;SP站点通过计算机名称可以访问&#xff0c;但不能通过IP地址访问 解决方案&#xff1a;打开SharePoint2010管理中心》应用程序管理》配置备用访问映射》编辑公用 URL 备用访问映射集&#xff1a;选择要映射的网站集 默认:http://计算机名 Intranet &#xff1a…

公有云与私有云的差别(转)

公有云与私有云的差别 发现每一个公司对私有云、公有云的定义都不一样&#xff0c;能够从公有云与私有云的差别上理解这个概念。下面转载网络上一个比較浅显的解释&#xff1a; 差别1&#xff1a;从云的建设地点划分&#xff0c;公有云——互联网上公布的云计算服务&#xff1b…

流媒体协议初探(MPEG2-TS、RTSP、RTP、RTCP、SDP、RTMP、HLS、HDS、HSS、MPEG-DASH)

目录一、综述需求分析协议定制二、MPEG2-TS协议三、RTSP协议、RTP、RTCP、SDPRTSPRTP、RTCP、SDP四、RTMP五、HLS、HDS、HSSHLSHDS和HSS六、MPEG-DASH协议具体内容应用七、流媒体服务器流媒体服务器的功能与挑战客户端支持协议支持应用场景应用特点扩展技术广告投放录屏其他一、…

eclipse偶尔会反映迟钝,直接无视其报错

比如&#xff0c;你在web.xml中配置了什么东西&#xff0c;在有的时候不一定就会立即被eclipse察觉到&#xff0c;即便你的配置正确了&#xff0c;甚至重启了几次服务器&#xff0c;它仍然给你报错 比如说&#xff0c;刚才我在web.xml中配置了一个taglib&#xff0c;并且tld文件…

Qos(Quality of Service)

QOS&#xff08;即Quality of Service&#xff0c;服务质量&#xff09;主要指网络环境下服务满足用户的程度&#xff0c;在视频服务的语境下也可认为是Quality of Streaming&#xff0c;即流媒体服务的质量。通常&#xff0c;QOS可以由一系列指标表达&#xff0c;如传输的速度…

Popline:帅气的浮动 HTML5 文本编辑器工具栏

Popline 是一个基于 HTML5 实现的富文本编辑器工具栏&#xff0c;设计灵感来自 PopClip &#xff0c;相比传统的文本编辑器工具&#xff0c;Popline 能够浮动在编辑的文本周围&#xff0c;操作起来十分方便。 您可能感兴趣的相关文章Metronic – 基于 Bootstrap 响应式后台管理…

C#反射Assembly 具体说明

1、对C#反射机制的理解 2、概念理解后&#xff0c;必须找到方法去完毕&#xff0c;给出管理的主要语法 3、终于给出有用的样例&#xff0c;反射出来dll中的方法 反射是一个程序集发现及执行的过程&#xff0c;通过反射能够得到*.exe或*.dll等程序集内部的信息。使用反射能够看到…

流媒体技术优化

文章目录1、下载策略优化CDN选择策略错误处理策略码率选择策略2、协议和架构优化HTTP2TCP变种拥塞控制QUIC架构流媒体协议的选择与分发体系架构的设计对优化起着关键作用。 HLS和DASH协议在点播和OTT直播服务中已逐渐占据主流&#xff0c;其思想主要是将视频转为不同码率并切为…

Android——android必看 各个控件属性(网上看到的文字,觉得挺好的,珍藏了)...

属性 值 说明 Android:orientation horizontal/vertical 设置布局水平还是垂直&#xff0c;默认是垂直 android:checked true/false 标记默认选中&#xff0c;如果是单选则选中最后一个 android:layout_gravity center/right/left/bottom/top 位置 android:gravity…

java中接口的定义与实现

1、定义接口 使用interface来定义一个接口。接口定义同类的定义类似&#xff0c;也是分为接口的声明和接口体&#xff0c;当中接口体由常量定义和方法定义两部分组成。定义接口的基本格式例如以下&#xff1a; [修饰符] interface 接口名 [extends 父接口名列表]{ [public] …

API设计笔记:pimpl技巧

pimpl pointer to implementation&#xff1a;指向实现的指针&#xff0c;使用该技巧可以避免在头文件暴露私有细节&#xff0c;可以促进API接口和实现保持完全分离。 Pimpl可以将类的数据成员定义为指向某个已经声明过的类型的指针&#xff0c;这里的类型仅仅作为名字引入&am…

C++必读书

C必读书 《Inside The C Object Model》 《Effective C》和《More Effective C》以及《Exceptional C》 《C面向对象高效编程(C Effective Object-Oriented Software Construction)》 《面向对象软件构造(Object-Oriented Software Construction)》 《设计模式(Design Patterns…

python socket编程实现的简单tcp迭代server

与c/c socket编程对照见http://blog.csdn.net/aspnet_lyc/article/details/38946915 server&#xff1a; import socketPORT 9999 BACKLOG 5 MAXLINE 1024listenfd socket.socket(socket.AF_INET,socket.SOCK_STREAM) listenfd.bind((,PORT)) listenfd.listen(BACKLOG)w…