我想了解C ++类型以及更多细节(特定于C ++ 03)的扩展和缩小转换。我知道你不能在一个问题线程上提出多个问题但是所有这些问题都与同一主题。现在我有C ++类型和范围msdn
现在考虑以下示例:
int a = 35000;
short b;
b=a;
现在在上面的示例中,我知道a
是4个字节,b
是2个字节。我知道扩展转换会提高精度,因为缩小转换会降低精度。上面的例子我认为是一个缩小的演员(因为有数据丢失)4个字节进入两个字节。但是,在某些情况下,我感到困惑的是,正在进行的转换正在扩大还是正在缩小?我们是否考虑查看类型的字节数以确定它是扩大转换还是缩小转换,还是我们假设要查看范围?我还读到,为了缩小转换,需要显式转换,但在这种情况下,编译器没有指出任何错误,并隐含地进行了错误的转换。有关为何发生的任何建议?我正在使用VS2010
答案 0 :(得分:6)
缩小 例如,long long
和double
通常都是相同的大小(每个64位)。尽管如此, 方向的转换是一种缩小的转换,因为信息可能会丢失。有符号整数类型和相同大小的无符号整数类型之间的转换也会发生同样的情况 - 任一方向的转换都可能丢失信息(即,导致值与输入不匹配)因此两者都是考虑缩小转换率。
如果你只在同一类......类型中工作(例如,所有有符号整数或所有浮点数),那么你可以使用项目的大小来确定转换是否会涉及缩小(理论上可能是错误的时间/情况,但大多数硬件和编译器提供的类型都是如此。
另请注意,当源是文字时,C ++会为转换添加一些例外,并且源值可以放在目标中而不会丢失信息,即使源类型的某些值< em>可能导致信息丢失。
例如,如果我执行float a = 3.5;
之类的操作,则文字3.5
的类型为double
,但是,因为它是文字的,它可以转换为float
而不会丢失信息,即使在禁止缩小转化的地方(例如,支持初始化列表)也允许这样做。
答案 1 :(得分:0)
对于积分类型,精度始终为1.加宽转换会增加范围,缩小转换会缩小范围。
http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
空头的范围是-32,768到32,767。你的输入,3500比那更大。最终发生的是数字被塞入较小的字节数,导致环绕错误(b为负)。 (其具体内容与2的补充有关,但不是,但对于你的等级,只要说“你打破它,它不起作用”就足够了。)
要避免使用带有gcc的-Wnarrowing
或-Wall
编译器,或使用visual studio编译器编译/Wall
(我实际上并不知道/ Wall是否会捕获它)。< / p>