C++有符号和无符号之间的转换问题
先来看一个程序:
#include<iostream> int main() { unsigned a=5; int b=-10; std::cout<<b+b<<std::endl;//正常输出 std::cout<<a+b<<std::endl; return 0; }
打印:-20
4294967291
-20正常打印我们都知道,但当一个有符号和一个无符号之间的数进行相加减会发生什么呢?
是这样的:a+b,首先把负数转换为无符号数,然后在进行运算。
b转换为无符号数就是对b取模,2^32+b,结果为4294967286。
再看:
#include<iostream> int main() { unsigned a=10,b=5; std::cout<<b-a<<std::endl; return 0; }
打印:4294967291
其过程是对运算后的结果-5取模
循环中的发现:
#include<iostream> int main() { unsigned u=5; while(u>=0) { --u; std::cout<<u<<std::endl; } return 0; }
运行结果将是无限打印,原因是:当u=0时,仍能进去循环,然后u=-1了,由于u的类型是unsigned则被取模转换了,则u总是大于0的,所以是无限循环。
此时应将while里面的条件改成:u>0,当u=0时不能进去循环,u不是小于0也就没有类型转换,则循环能终止。
到此这篇关于C++有符号和无符号之间的转换的文章就介绍到这了,更多相关c++有符号无符号转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++ 处理中文符号实例详解
C++ 处理中文符号 英文符号替换为英文逗号 processPunctuation(string& tag) { std::set<char> punctuation_set; punctuation_set.insert(' '); punctuation_set.insert('\t'); punctuation_set.insert(';'); for (int i=0; i< tag.size(); i++) { if (punctuation_set.find(tag[
-
C++无法重载点符号、::、sizeof等的原因
大多数的运算符能够被程序员重载.例外的是: . (点符号) :: ?: sizeof 并没有什么根本的原因要禁止重载?:.仅仅是因为,我没有发现有哪种特殊的情况需要重载一个三元运算符.注意一个重载了 表达式1?表达式2:表达式3 的函数,不能够保证表达式2:表达式3 中只有一个会被执行. Sizeof 不能够被重载是因为内建的操作(built-in operations),诸如对一个指向数组的指针进行增量操作,必须依靠它.考虑一下: X a[10]; X* p = &a[3]; X* q
-
C++符号优先级(详细整理)
Precedence Operator Description Example Associativity 1 ()[]->.::++-- Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-incrementPost-decrement (a + b) / 4;array[4] = 2;ptr->age = 34;obj.age =
-
关于c++编译protobuf时提示LNK2001 无法解析的外部符号的问题
在所在配置完成后编译protobuf时还是提示如下 LNK2001 无法解析的外部符号 "union google::protobuf::internal::EmptyString google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3TEmptyString@123@A) 真坑啊,各种操作猛如虎后结果还是不行. vs
-
C++有符号和无符号之间的转换问题
先来看一个程序: #include<iostream> int main() { unsigned a=5; int b=-10; std::cout<<b+b<<std::endl;//正常输出 std::cout<<a+b<<std::endl; return 0; } 打印:-20 4294967291 -20正常打印我们都知道,但当一个有符号和一个无符号之间的数进行相加减会发生什么呢? 是这样的:a+b,首先把负数转换为无符号数,然后在进
-
JavaScript 无符号右移运算符
使用示例 result = expression1 >>> expression2 其中result是任何变量. expression1是任何表达式. expression2是任何表达式. JavaScript中无符号右移运算符说明 >>> 运算符把 expression1 的各个位向右移 expression2 指定的位数.右移后左边空出的位用零来填充.移出右边的位被丢弃.例如: var temp temp = -14 >>> 2 变量 temp 的
-
PHP中把有符号整型转换为无符号整型方法
在一个短地址项目中,根据六位字符与ID的相互映射的算法,当ID超过2147483647的时候,六位字符的短地址映射的ID变成有符号的整型. 复制代码 代码如下: ID > 六位字符 >映射ID ID: 2147483644 > TfffVQ > 2147483644 ID: 2147483645 > efffVQ > 2147483645 ID: 2147483646 > NfffVQ > 2147483646 ID: 21474
-
JavaScript 无符号右移赋值操作
示例代码: result >>>= expression 其中参数是result任何变量. expression是任何表达式. JavaScript中无符号右移赋值操作说明 使用 >>>= 运算符和使用下面的语句是等效的: result = result >>> expression >>>= 运算符把 result 的所有位向右移 expression 指定的位数.右移后左边空出的位用零来填充.向右移出的位被丢弃.例如: var t
-
C语言中无符号与有符号及相加问题
C语言中无符号与有符号问题 unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a[]范围为-128~127. 数组中128和182均无效. C语言中无符号数和有符号数相加问题 看个题: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n"
-
Java 无符号右移与右移运算符的使用介绍
Java 无符号右移介绍 最近学习Java,看到>>>运算符不太了解,也百度查了查,解释得不是很清晰.那么下面讲解我对>>>运算符的认识: >>>运算符:无符号右移运算符 在学习>>>无符号右移运算符前,我们先了解右移运算符>> 下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13: 操作符 描述 例子 & 如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 11
-
浅谈C语言中的强符号、弱符号、强引用和弱引用
首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望高人指点. 首先我们看一下书中关于它们的定义. 引入场景:(1)文件A中定义并初始化变量i(int i = 1), 文件B中定义并初始化变量i(int i = 2).编译链接A.B时会报错b.o:(.data+0x0): multiple definition of `i':a.o:(.d
-
C语言中的强符号和弱符号介绍
之前在extern "C" 用法详解中已经提到过符号的概念,它是编译器对变量和函数的一种标记,编译器对C和C++代码在生产符号时规则也是不一样的,符号除了本身名字的区别外,还有强符号和弱符号之分 我们先看一段简单的代码 复制代码 代码如下: /* test.c */ void hello(); int main() { hello(); return 0; } 很显然,这段代码是没法链接通过的,它会报错undefined reference to hello
-
新手小心:c语言中强符号与弱符号的使用
声明:下面的实例全部在linux下尝试,window下未尝试.有兴趣者可以试一下.文章针c初学者.c语言的强符号和弱符号是c初学者经常容易犯错的地方.而且很多时候,特别是多人配合开发的程序,它引起的问题往往非常行为怪异而且难以定位.什么是强符号和弱符号?在c语言中,函数和初始化的全局变量是强符号,未初始化的全局变量时弱符号.强符号和弱符号的定义是连接器用来处理多重定义符号的,它的规则是:不允许多个强符号:如果一个强符号和一个弱符号,这选择强符号:如果多个弱符号,则任意选一个.它的陷阱:上代码:
-
浅谈Python数据类型之间的转换
Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 complex(real [,imag]) 创建一个复数 str(x) 将对象 x 转换为字符串 repr(x) 将对象 x 转换为表达式字符串 eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象 tuple(s) 将序列 s 转换为一个元组 list(s) 将序列 s 转换为一个
随机推荐
- Flex中对表格中某列的值进行数字格式化保留两位小数
- 最新版CKEditor的配置方法及插件(Plugin)编写示例
- JSP 中Hibernate实现映射枚举类型
- 百度编辑器二次开发常用手记整理小结
- jQuery网页定位导航特效实现方法
- jquery实现从数组移除指定的值
- 深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
- 原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
- linux下php加装mssql模块的方法
- javascript使用正则表达式实现去掉空格之后的字符
- js确认删除对话框适用于a标签及submit
- 基于jQuery实现动态搜索显示功能
- EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
- Javascript 实现简单计算器实例代码
- Android中实现记事本动态添加行效果
- Android实现游戏中的渐隐和渐现动画效果
- Javascript中Eval函数的使用
- 那些年,我还在学习C# 学习笔记续
- vithink小文件自动实现文件浏览下载
- Android开发中总结的Adapter工具类【附完整源码下载】