C语言算术转换?
《C语言核心技术》
第4章 类型转换
通常算术转换
“b.否则,一个操作数具有一个有符号的类型T,其转换等级比另一个操作数的等级高,并且T足以表示另一个操作数类型所有可能值,则另一个操作数会被转换为T类型。
若T不足以表示另一个操作数类型的所有值,那么两个操作数都会被转换为“和有符号类型T”[color=#993300]等价的无符号类型[/color]。 ”
------------------------------------------------------------------------
问题:
一,“T足以表示另一个操作数类型所有可能值”,这句话是什么意思?
二,“那么两个操作数都会被转换为“和有符号类型T”[color=#993300]等价的无符号类型[/color]。”,什么是等价的无符号类型?
[解决办法]
一,主要说的是类型提升,比如float运算时,碰到double,会转化为double,double的范围就足以表示float
二,等价的无符号类型,就是直接在前面加 unsigned,比如char和无符号char
[解决办法]
,“T足以表示另一个操作数类型所有可能值”, -- T 的范围 》= 另一个操作数类型;
如果读起来如此饶口,不如换一本,或读原文
[解决办法]
limits.h
/****limits.h - implementation dependent values** Copyright (c) Microsoft Corporation. All rights reserved.**Purpose:* Contains defines for a number of implementation dependent values* which are commonly used in C programs.* [ANSI]** [Public]*****/#pragma once#include <crtdefs.h>#ifndef _INC_LIMITS#define _INC_LIMITS#ifndef _CRTBLD/* This version of the header files is NOT for user programs. * It is intended for use when building the C runtimes ONLY. * The version intended for public use will not have this message. */#error ERROR: Use of C runtime library internal header file.#endif /* _CRTBLD */#define CHAR_BIT 8 /* number of bits in a char */#define SCHAR_MIN (-128) /* minimum signed char value */#define SCHAR_MAX 127 /* maximum signed char value */#define UCHAR_MAX 0xff /* maximum unsigned char value */#ifndef _CHAR_UNSIGNED#define CHAR_MIN SCHAR_MIN /* mimimum char value */#define CHAR_MAX SCHAR_MAX /* maximum char value */#else /* _CHAR_UNSIGNED */#define CHAR_MIN 0#define CHAR_MAX UCHAR_MAX#endif /* _CHAR_UNSIGNED */#define MB_LEN_MAX 5 /* max. # bytes in multibyte char */#define SHRT_MIN (-32768) /* minimum (signed) short value */#define SHRT_MAX 32767 /* maximum (signed) short value */#define USHRT_MAX 0xffff /* maximum unsigned short value */#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */#define INT_MAX 2147483647 /* maximum (signed) int value */#define UINT_MAX 0xffffffff /* maximum unsigned int value */#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */#define LONG_MAX 2147483647L /* maximum (signed) long value */#define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */#define LLONG_MAX 9223372036854775807i64 /* maximum signed long long int value */#define LLONG_MIN (-9223372036854775807i64 - 1) /* minimum signed long long int value */#define ULLONG_MAX 0xffffffffffffffffui64 /* maximum unsigned long long int value */#define _I8_MIN (-127i8 - 1) /* minimum signed 8 bit value */#define _I8_MAX 127i8 /* maximum signed 8 bit value */#define _UI8_MAX 0xffui8 /* maximum unsigned 8 bit value */#define _I16_MIN (-32767i16 - 1) /* minimum signed 16 bit value */#define _I16_MAX 32767i16 /* maximum signed 16 bit value */#define _UI16_MAX 0xffffui16 /* maximum unsigned 16 bit value */#define _I32_MIN (-2147483647i32 - 1) /* minimum signed 32 bit value */#define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */#define _UI32_MAX 0xffffffffui32 /* maximum unsigned 32 bit value *//* minimum signed 64 bit value */#define _I64_MIN (-9223372036854775807i64 - 1)/* maximum signed 64 bit value */#define _I64_MAX 9223372036854775807i64/* maximum unsigned 64 bit value */#define _UI64_MAX 0xffffffffffffffffui64#if _INTEGRAL_MAX_BITS >= 128/* minimum signed 128 bit value */#define _I128_MIN (-170141183460469231731687303715884105727i128 - 1)/* maximum signed 128 bit value */#define _I128_MAX 170141183460469231731687303715884105727i128/* maximum unsigned 128 bit value */#define _UI128_MAX 0xffffffffffffffffffffffffffffffffui128#endif /* _INTEGRAL_MAX_BITS >= 128 */#ifndef SIZE_MAX#ifdef _WIN64#define SIZE_MAX _UI64_MAX#else /* _WIN64 */#define SIZE_MAX UINT_MAX#endif /* _WIN64 */#endif /* SIZE_MAX */#if __STDC_WANT_SECURE_LIB__/* While waiting to the C standard committee to finalize the decision on RSIZE_MAX and rsize_t, * we define RSIZE_MAX as SIZE_MAX */#ifndef RSIZE_MAX#define RSIZE_MAX SIZE_MAX#endif /* RSIZE_MAX */#endif /* __STDC_WANT_SECURE_LIB__ */#endif /* _INC_LIMITS */
[解决办法]
其实还是C89里的描述比较清晰,
3.2.1.5 Usual arithmetic conversions
Many binary operators that expect operands of arithmetic type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions: First, if either operand has type long double, the other operand is converted to long double. Otherwise, if either operand has type double, the other operand is converted to double. Otherwise, if either operand has type float, the other operand is converted to float. Otherwise, the integral promotions are performed on both operands. Then the following rules are applied: If either operand has type unsigned long int, the other operand is converted to unsigned long int. Otherwise, if one operand has type long int and the other has type unsigned int, if a long int can represent all values of an unsigned int, the operand of type unsigned int is converted to long int ; if a long int cannot represent all the values of an unsigned int, both operands are converted to unsigned long int. Otherwise, if either operand has type long int, the other operand is converted to long int. Otherwise, if either operand has type unsigned int, the other operand is converted to unsigned int. Otherwise, both operands have type int.
The values of operands and of the results of expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.