c语言整形数乘以负数,当乘以浮点数时,无符号长整数可以变为负数吗?

标题可能是错误的选择,但我找不到这个问题的好的一行摘要.我的问题是我无法弄清楚我的编译器在做什么,我想知道我是否在编译器中发现了一个错误......或者我对C语言的理解.

我的理解是:

- 1UL == ULONG_MAX这是安全的,因为无符号数的溢出行为已被很好地定义

该产品(- 1UL) * 1.0f涉及将左操作数转换为float,并且此转换保留ULONG_MAX除了舍入错误之外的值(即)

到目前为止,我的编译器同意,除非1UL来自变量.这是我的测试程序,其输出为注释:

#include

int main(void)

{

unsigned long one = 1;

unsigned long minus_one = - one;

printf("%lu\n", - one); // 18446744073709551615

printf("%g\n", minus_one * 1.0f); // 1.84467e+19

printf("%g\n", (- one) * 1.0); // 1.84467e+19

printf("%g\n", (- 1UL) * 1.0f); // 1.84467e+19

printf("%g\n", (- one) * 1.0f); // -1

return 0;

}

我无法理解最后的输出.我尝试了各种优化级别和各种语言标准(C90,C99和C11),结果相同.谁有线索?

环境:gcc 4.8.1/Ubuntu Linux 14.04/x86-64(I32LP64)

编辑:我刚刚注意到我的问题可能是一元减号和浮点数转换组合的重复.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值