赋值中的自动类型转换(上)
postgresql自动类型转换

postgresql⾃动类型转换⼀、错误案例1、赋值错误:ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20005} execute error. UPDATE sys_permission SET parent_id=? is_leaf=? internal_or_external=? WHERE id=?org.postgresql.util.PSQLException: 错误: 字段 "is_leaf" 的类型为 integer, 但表达式的类型为 boolean 建议:你需要重写或转换表达式位置:126解决⽅法:update pg_cast set castcontext='a'where castsource ='boolean'::regtype and casttarget='integer'::regtype;2、查询错误:ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20003} execute error. SELECT * FROM QRTZ_FIRED_TRIGGERS WHERE SCHED_NAME = 'quartzScheduler' AND INSTANCE_NAME = ? AND REQUESTS_RECOVERY = ?org.postgresql.util.PSQLException: 错误: 操作符不存在: character varying = boolean建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.解决⽅法:update pg_cast set castcontext='i'where castsource ='boolean'::regtype and casttarget='text'::regtype;update pg_cast set castcontext='i'where castsource ='boolean'::regtype and casttarget='character'::regtype;update pg_cast set castcontext='i'where castsource ='boolean'::regtype and casttarget='character varying'::regtype;⽤该⽅法之后应该可以执⾏转换了,但是有可能把true转换成"true"存到数据库中,这个时候,就需要⽤实例2的⽅法了⼆、知识点总结PostgreSQL 数据类型直接有3种转换,隐式转换,赋值转换,显式转换;对应的转换类型存在系统表 pg_cast中三种⽅式分别对应 i(Implicit),a(Assignment),e(Explicit)查询所有转换:select castsource::regtype,casttarget::regtype,castcontext,castfunc from pg_cast where castsource='boolean'::regtype;三者的转换关系为 i > a > e;意思是可以隐式转换的⼀定可以赋值转换和显式转换;可以赋值转换的⼀定可以显式转换可以显式转换的不能隐式转换和赋值转换。
c语言中自动类型转换 赋值转换 强制类型转换

C语言中的自动类型转换、赋值转换和强制类型转换是程序员在进行编程时需要了解和掌握的重要概念。
这些类型转换涉及到数据类型之间的转换和转换规则,对于编写高质量、稳健性好的程序至关重要。
我们来了解一下自动类型转换。
在C语言中,当不同类型的数据混合运算时,系统会根据一定的规则进行自动类型转换,使得操作数的类型一致。
这是为了保证数据类型匹配,避免出现不必要的错误。
当我们对一个整型变量和一个浮点型变量进行运算时,系统会自动将整型转换为浮点型,以便进行运算。
赋值转换也是C语言中的一个重要概念。
赋值转换指的是将一个值赋给一个变量时,系统会根据变量的类型进行自动类型转换。
在进行赋值操作时,如果赋给变量的值的类型和变量的类型不一致,系统会进行自动类型转换,将值的类型转换为变量的类型,以确保赋值的正确性。
需要了解的是强制类型转换。
在某些情况下,程序员可能需要显式地对数据类型进行转换,这就需要使用强制类型转换。
通过强制类型转换,程序员可以将一个数据类型转换为另一个数据类型,以满足特定的需求。
需要注意的是,在进行强制类型转换时,需要格外小心,确保转换的正确性和安全性。
总结起来,C语言中的自动类型转换、赋值转换和强制类型转换是程序员需要理解和掌握的重要概念。
通过深入了解这些类型转换的规则和原理,可以帮助程序员编写高质量、稳健性好的程序。
在实际的编程过程中,程序员需要根据具体的情况,合理地运用这些类型转换,以确保程序的正确性和效率。
以上是我对C语言中自动类型转换、赋值转换和强制类型转换的个人观点和理解。
希望这篇文章能够帮助你更好地理解这些重要的编程概念,并在实际编程中灵活运用。
在C语言中,自动类型转换是指在不同类型的数据混合运算时,系统会根据一定的规则进行自动类型转换,以使操作数的类型一致。
这样可以避免出现数据类型不匹配的错误,确保程序的正确性和稳定性。
自动类型转换的规则是根据数据类型的优先级进行转换,通常情况下,整型数据会自动转换为浮点型数据,而较小的数据类型会转换为较大的数据类型。
c语言知识点

程序中的任何部分作注释。
2、标识符、常量和变量0704X13 0709X12(1)标识符1)关键字:在程序中都代表着固定的含义,不能另作他用2)预定义标识符:在程序中预先定义并具有特定含义的标识符,并且允许把它重新定义另作他用,但会失去原有的意义。
3)用户标识符:由用户根据需要定义的标识符。
(2)常量:在程序运行过程中,其值不能被改变的量。
符号常量:用标示符代表一个常量。
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义,其一般形式为:#define 标识符常量(3)变量:在程序运行过程中,其值可以改变的量称为变量。
变量名和变量值变量名每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。
定义变量名:C语言规定标识符只能由字母、数字、下划线三种字符组成,且第一个字符必须是字母或下划线。
注意:大写字母和小写字母被认为是两个不同的字符。
sum和SUM是两个不同的变量名。
C语言规定:对所有用到的变量要“先定义,后使用”。
a)凡未被事先定义的,不作为变量名。
b)每一个变量被指定为一确定类型3、整型数据0704X13整型常量的表示方法C整常数有三种表示方法:(1)十进制整数。
如123,0.,56(2)八进制整数。
以0开头的数是八进制。
如0123表示八进制123。
(3)十六进制整数。
以0x开头的数是十六进制数。
如0x123整型变量a)整型数据在内存中的存放形式数据在内存中是以二进制形式存放的。
b)整型变量的分类基本整型,以int 表示值的范围是-215-(215- 1)即-32768~32767 短整型,以short int 表示,或以short表示长整型,以long int 表示,或以long 表示。
Unsigned short [int] 16 0-655350-(216-1)Long [int] 32 -2147483648-2147483647-231-(231-1)Unsigned long [int] 32 0-42949672950-(232-1)整型常量的类型一个整常量后面加一个字母u或U,认为是unsigned int型,如12345u,在一个整常量后面加一个字母l或L,则认为是long int型常量。
数据类型转换规则

数据类型转换规则
数据类型转换是程序设计中常见的操作,不同类型的数据之间存在着不同的转换规则。
以下是常见的数据类型转换规则:
1. 自动类型转换
当运算符或函数的参数需要不同类型的数据时,系统会自动将其中一种数据类型转换为另一种数据类型。
例如,将整数类型赋值给浮点数类型时,系统会自动将整数类型转换为浮点数类型。
2. 强制类型转换
在某些情况下,需要将一个数据类型强制转换为另一种数据类型。
这种转换方式称为强制类型转换。
强制类型转换可以通过在需要转换的数据类型之前加上括号,并在括号内加上目标数据类型来实现。
例如,将浮点数类型强制转换为整数类型时,可以使用以下代码:int a = (int) b;
3. 数据类型优先级
当系统需要同时进行多种类型转换时,会根据数据类型优先级进行转换。
数据类型优先级从高到低依次为:
double > float > long long > int > short > char 例如,当需要将一个浮点数和一个整数进行运算时,系统会将整数类型自动转换为浮点数类型,然后进行运算。
- 1 -。
Java数据类型转换:强制类型转换 自动类型转换28

数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。
数据类型的转换可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。
隐式转换(自动类型转换)如果以下 2 个条件都满足,那么将一种类型的数据赋给另外一种类型变量的时,将执行自动类型转换(automatic type conversion)。
•两种数据类型彼此兼容•目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)当以上 2 个条件都满足时,拓宽转换(widening conversion)发生。
例如 byte 类型向 short 类型转换时,由于 short 类型的取值范围较大,会自动将 byte 转换为 short 类型。
在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。
自动转换的规则是从低级类型数据转换成高级类型数据。
转换规则如下:•数值型数据的转换:byte→short→int→long→float→double。
•字符型转换为整型:char→int。
以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。
例 1顾客到超市购物,购买牙膏 2 盒,面巾纸 4 盒。
其中牙膏的价格是 10.9 元,面巾纸的价格是5.8 元,求商品总价格。
实现代码如下:1.public static void main(String[] args) {2. float price1 = 10.9f; // 定义牙膏的价格3. double price2 = 5.8; // 定义面巾纸的价格4. int num1 = 2; // 定义牙膏的数量5. int num2 = 4; // 定义面巾纸的数量6. double res = price1 * num1 + price2 * num2; // 计算总价7. System.out.println("一共付给收银员" + res + "元"); // 输出总价8.}上述代码中首先定义了一个 float 类型的变量存储牙膏的价格,然后定义了一个 double 类型的变量存储面巾纸的价格,再定义两个 int 类型的变量存储物品的数量,最后进行了乘运算以及和运算之后,将结果储存在一个 double 类型的变量中进行输出。
必须重视的Oracle自动类型转换

29.必须重视的Oracle自动类型转换显示类型转换以date类型为例子。
Oracle中对不同类型的处理具有显式类型转换(Explicit)和自动类型转换(隐式类型转换Implicit)两种方式,对于显式类型转换,我们是可控的,但是对于自动类型转换,当然不建议使用,因为很难控制,有不少缺点,但是我们很难避免碰到自动类型转换,如果不了解自动类型转换的规则,那么往往会改变我们SQL的执行计划,从而可能导致效率降低或其它问题,所以,Oracle开发人员很有必要了解Oracle自动类型转换的相关规则,从而避免自动类型转换导致相关问题的产生。
本章首先会对Oracle自动类型转换的规则做阐述,然后结合相关实例分析自动类型转换可能造成的问题。
29.1 数据类型优先级Oracle使用数据类型的优先级来决定自动类型转换,Oracle类型如下优先:■ Datetime and interval 类型■ BINARY_DOUBLE■ BINARY_FLOAT■ NUMBER■字符类型■所有其它内置类型上面说的不够具体,我们看第二节具体的类型转换规则。
29.2 自动类型转换规则一般一个表达式不能包含多种数据类型,比如一个表达式5*10然后加上'james',但是Oracle会有自动类型转换和显式类型转换两种规则,我们看如下例子:DINGJUN123>select 5*10+'james' from dual;select 5*10+'james' from dual*第1 行出现错误:ORA-01722: 无效数字我们看到,报无效数字错误。
当然,这里Oracle使用了自动类型转换将'james'转为数字类型,但是这个转换是失败的,所以报错,所以自动类型转换的第1个规则就是必须自动类型转换能够成功,否则报错。
我们看下面的就转换成功了:DINGJUN123>select 5*10+'2' from dual;5*10+'2'----------52OK,看到了结果正确,这里的字符串'2'被自动转为数值类型的2(不明白为什么会这样转换,请往下看),所以结果为52.。
java语言基础--数据类型:详解char、int、自动类型转换、强制类型转换、精度损失
java语⾔基础--数据类型:详解char、int、⾃动类型转换、强制类型转换、精度损失数据类型--char⼀、char1.11. char占⽤2个字节2. char取值范围:【0~65535】3. char采⽤unicode编码⽅式4. char类型的字⾯量⽤单引号括起来5. char可以存储⼀个汉字1public class Test{23public static void main(String[] args){45//定义⼀个char类型的变量,起名c,同时赋值字符‘a’6char c1 = 'a';7 System.out.println(c);//结果为:a89//⼀个中⽂字符占⽤2个字节,char类型刚好是2个字节10//所以java中的char类型可以存储⼀个中⽂字符11char c2 ='果';12 System.out.println(c2);//结果为:果1314//如果加上单引号0就不是数字0了15char c3 = '0';16 System.out.println(c3);1718//编译报错:类型不兼容19char c4 = "a";20 System.out.println(c4);2122//错误:未结束的字符⽂字23char c5 = 'ab';24 System.out.println(c5);2526 }27 }1.2 数据类型-- 转义字符 ‘\’\t 表⽰"制表符tab"1public class Test{2public static void main(Stirng[] args){34//普通的n字符5char c1 = 'n';6 System.out.println(c1);//结果为:n78//经过编译,发现编译通过,这说明以下并不是⼀个字符串,⽽是⼀个字符9//这是⼀个“换⾏符”,属于char类型的数据10//反斜杠在java语⾔中具有转义功能11char c2 = '\n';1213 System.out.print("A");14 System.out.print(c2);15 System.out.println("B");16输出结果:17 A18 B19202122//制表符\t(tab)23//强调:制表符和空格不同,它们的ASCII码不同,体现在键盘上两个不同的“按键”24char y = '\t';25 System.out.print("A");26 System.out.print(y);27 System.out.println("B");28输出结果:29 A B3031 //假设现在想在控制台上输出⼀个‘ ' ’字符怎么办//错误:空字符⽂字//System.out.println(' ' ');//修改错误,(\'联合起来表⽰⼀个普通的‘)System.out.println('\'');3233//要求控制台上输出“反斜杠字符”34//反斜杠将后⾯的单引号转义成不具备特殊含义的普通单引号字符35//左边的单引号缺少了结束的单引号字符,编译报错36/*37 char k = '\';38 System.out.println(k); //编译报错39*/4041//第⼀个\具有转义功能,将后⾯的反斜杠转译为普通的反斜杠字符42//结论:java当中两个反斜杠代表⼀个普通的反斜杠字符43char k = '\\';44 System.out.println(k);4546//输出"HelloWorld!"47//System.out.println("\"HelloWorld!\"");4849 }50 }1public class CharTest{2public static void main(String[] args){3//双引号括起来的是字符串4 System.out.println("test");5//希望输出的结果是:“test”6//错误:需要')'7//System.out.println(""test"");8//修改9 System.out.println("\"test\"");10 System.out.println("“test”");//内部⽤中⽂双引号“”是可以的1112//编译报错:4e2d是字符串13//错误:未结束的字符⽂字14char x = '4e2d';1516//反斜杠u表⽰后⾯的是⼀个字符的unicode编码17//uncode编码是16进制的18char x = '\u4e2d';19 System.out.println(x);//'中'20 }21 }⼆、数据类型--整数型int1、java语⾔当中的“整数型字⾯值”被默认当作int类型来处理,要让这个“整数型字⾯值”被当作long类型来处理的话,需要在“整数型字⾯值”后⾯添加1/L,建议使⽤⼤写L2、java语⾔当中的整数型字⾯值有三种表⽰⽅式:⼗进制【是⼀种缺省默认的⽅式】int a=10;System.out.println(a);//10⼋进制【在编写⼋进制整数型字⾯值的时候需要以0开始】int b=010;System.out.println(b);//8⼗六进制【在编写⼗六进制整数型字⾯值的时候需要以0x开始】int c=0x10;System.out.println(c);//16⼆进制【JDK8新特性,低版本不⽀持】int d = 0b10;System.out.println(d);//2⾃动类型转换:1/*2在jiava中重要结论:3在任何情况下,整数型的“字⾯量/数据”默认被当作int类型处理。
数据类型之间的转换
数据类型之间的转换在编程中,数据类型之间的转换是常见的操作,通常涉及到不同数据类型之间的相互转换。
以下是一些常见的数据类型之间的转换方式:1. 隐式类型转换(自动类型转换):当一个数据类型的变量赋值给另一个数据类型的变量时,如果目标数据类型可以表示源数据类型的所有值,那么会发生隐式类型转换。
例如,将int赋值给double。
javaCopy codeint intValue = 10;double doubleValue = intValue; // 隐式类型转换2. 显式类型转换(强制类型转换):当目标数据类型无法容纳源数据类型的所有值时,需要使用显式类型转换,也称为强制类型转换。
在Java中,使用强制类型转换需要使用括号将目标类型括起来,并在前面加上目标类型的名称。
javaCopy codedouble doubleValue = 10.5;int intValue = (int) doubleValue; // 显式类型转换3. 字符串转换:将基本数据类型转换为字符串可以使用字符串连接或String.valueOf()等方法。
javaCopy codeint intValue = 42;String stringValue = intValue + ""; // 使用字符串连接// 或String stringValue2 = String.valueOf(intValue); // 使用String.valueOf()将字符串转换为基本数据类型可以使用相应的包装类的parseXxx 方法或 valueOf 方法。
javaCopy codeString strValue = "123";int intValue = Integer.parseInt(strValue); // 使用Integer.parseInt()4. 类型转换方法(Java 8及以上):Java 8引入了新的方法,使得在不同数据类型之间进行转换更加方便。
C语言中的整数自动转换原则
1、隐式转换C在以下四种情况下会进行隐式转换:1、算术运算式中,低类型能够转换为高类型。
2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
2、算数运算的隐式转换算数运算中,首先有如下类型转换规则:1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
2、short型转换为int型(同属于整型) 。
3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。
其次,有下面的规则。
当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。
转换规则如下图所示:有符号数与无符号数之间运算问题以下实验均在virual c++6中运行通过这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。
首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较: unsigned int a=20;signed int b=-130;a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。
再举一个例子:unsigned int a=20;signed int b=-130;std::cout<<a+b<<std::endl;结果输出为4294967186,同样的道理,在运算之前,a=20,b被转化为4294967166,所以a +b=4294967186减法和乘法的运算结果类似。
C语言数据类型转换(自动类型转换强制类型转换)
C语言数据类型转换(自动类型转换强制类型转换)数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。
自动类型转换自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。
1) 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:float f = 100;100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量f。
再如:int n = f;f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。
对于不安全的类型转换,编译器一般会给出警告。
2) 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。
转换的规则如下:•转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。
例如,int 和long 参与运算时,先把int 类型的数据转成long 类型后再进行运算。
•所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
•char 和 short 参与运算时,必须先转换成 int 类型。
下图对这种转换规则进行了更加形象地描述:unsigned 也即 unsigned int,此时可以省略 int,只写 unsigned。
自动类型转换示例:复制纯文本复制1.#include<stdio.h>2.int main(){3.float PI = 3.14159;4.int s1, r = 5;5.double s2;6.s1 = r * r * PI;7.s2 = r * r * PI;8.printf('s1=%d, s2=%f\n', s1, s2);9.10.return 0;11.}#include<stdio.h> int main(){ float PI = 3.14159; int s1, r = 5; double s2; s1 = r * r * PI; s2 = r * r * PI; printf('s1=%d, s2=%f\n', s1, s2); return 0; }运行结果:s1=78, s2=78.539749在计算表达式r*r*PI时,r 和 PI 都被转换成 double 类型,表达式的结果也是 double 类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char
short int
unsigned short int
int, long
unsigned int, unsigned long
float
C语言程序设计
double
所占字节数
取值范围
1
-128~127
1
0~255
2
-32768~32767
2
0~65535
4
-2147483648~2147483647
讨题
为什么整数没有下溢出,而浮点数有下溢出?
C语言程序设计
4
0~4294967295
4
-3.4×1038~3.4×1038
8
-1.7×10308~1.7×10308
第2章 C运算符和表达式
数值溢出
问题:何为数值溢出?为什么会发生数值溢出?
任何类型都只能用有限的位数来存储数据,表数范围有限 向变量赋的值超出了其类型的表数范围 1996年,阿丽亚娜火箭发射失败
将浮点数转换成整数,发生溢出
小蛇能吞下 大象吗?
C语言程序设计
第2章 C运算符和表达式
数值溢出
生活中数值溢出的例子
20世纪末爆发的千年虫问题 在99年存钱,到01年取出,该怎样计算利息呢? 第一代身份证号码中的出生年——如何区分百岁老人和婴儿?
C语言程序设计
第2章 C运算符和表达式
C语言程序设计
第2章 C运算符和表达式
整数的数值溢出
#include <stdio.h> int main() {
short a; int b = 65537; a = b; printf("%hd,%d\n", a, b); return 0; }
#include <stdio.h> int main() {
%hu,输出无符号短整数 借位借到超出了最高位
a(8) 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 b(10) 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 a-b(65534) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
65534
C语言程序设计
short a; int b = 32768; a = b; printf("%hd,%d\n", a, b); return 0; }
C语言程序设计
第2章 C运算符和表达式
整数的数值溢出
#include <stdio.h> int main() {
unsigned short a = 8; unsigned short b = 10; printf("%hu\n", a - b); return 0; }
对于无符号数,不能随意用a-b<0取代a<b
第2章 C运算符和表达式
浮点数的数值溢出
上溢出:
|浮点数运算结果| > |类型能表示的最大数|
下溢出
|浮点数运算结果| < |类型能表示的最小数| 此时,系统将运算结果处理成机器0
C语言程序设计
负上溢
-∞
最小 负数
负下溢 正下溢
负数
0
左侧(目标侧)与右侧类型不一致
问题:自动类型转换的规则是什么?
变量 = 表达式;
类型2 ← 类型1
C语言程序设计
第2章 C运算符和表达式
自动类型转换
问题:在不同类型数据间赋值,是安全的吗?
取值范围大的类型取值范围小的类型,通常是不安全的
数值溢出(Overflow)
数据类型
char
a(65535) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 a+1(0) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
C语言程序设计
第2章 C运算符和表达式
整数的数值溢出
上溢出
|一个数值运算结果| > |类型能表示的最大数| 进位超过最高位而发生进位丢失 或进位到达最高位而改变符号位
数值溢出
解决对策
用取值范围更大的类型,有助于防止数值溢出
但可能会导致存储空间的浪费
了解处理问题的规模,选取恰当的数据类型 同种类型在不同的平台其占字节数不尽相同
不要对变量所占的内存空间字节数想当然 用sizeof获得变量或者数据类型的长度
C语言程序设计
第2章 C运算符和表达式
a(32767) 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 a+1(32768) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a+1(-32768) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 -1 1
-32767 32767 -32768
运算结果超出了long所能表示的数的上界, 进位到达了最前面的符号位(01)
C语言程序设计
第2章 C运算符和表达式
整数的数值溢出
上溢出
|一个数值运算结果| > |类型能表示的最大数| 进位超过最高位而发生进位丢失 或进位到达最高位而改变符号位
0 65535 1
32767 32768
正数
最大 最小
负数 正数
正上溢
+∞
最大 正数
第2章 C运算符和表达式
数值溢出
数值溢出的危害
编译器有时对它熟视无睹,只是输出奇怪的结果
在平台间移植时,例如程序从高位计算机向低位计算机移植 (如从64位系统移植到32位系统)时,可能出现溢出,这种 问题经常被忽视
C语言程序设计
第2章 C运算符和表达式
整数的数值溢出
#include <stdio.h> int main() {
long a; a = 200*300*400*500; printf("%ld\n", a); return 0; }
Visual C++6.0下给出的警告 integral constant overflow Code::Blocks下给出的警告 integer overflow in expression
第2章 C运算符和表达式
——赋值中的自动类型转换 (数值溢出问题)
第2章 C运算符和表达式
本节要讨论的主要问题
在不同类型的数据间赋值是安全的吗? 为什么会出现数值溢出?何为数值溢出?
数值溢出的危害是什么?
C语言程序设计
第2章 C运算符和表达式
自动类型转换
问题:赋值操作中,何时发生自动类型转换?