编译以下代码:
double getDouble()
{
double value = 2147483649.0;
return value;
}
int main()
{
printf("INT_MAX: %u\n", INT_MAX);
printf("UINT_MAX: %u\n", UINT_MAX);
printf("Double value: %f\n", getDouble());
printf("Direct cast value: %u\n", (unsigned int) getDouble());
double d = getDouble();
printf("Indirect cast value: %u\n", (unsigned int) d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出 (MSVC x86):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483648
Indirect cast value: 2147483649
Run Code Online (Sandbox Code Playgroud)
输出 (MSVC x64):
INT_MAX: 2147483647
UINT_MAX: 4294967295
Double value: 2147483649.000000
Direct cast value: 2147483649
Indirect cast value: …Run Code Online (Sandbox Code Playgroud) 如果将负浮点值转换为无符号整数类型的值,会发生什么?标准报价将不胜感激.我面临的问题是从变量类转换为无符号整数类型的值,它包含一个浮点类型的对象.
例:
unsigned i = -.1;
Run Code Online (Sandbox Code Playgroud) 根据这里的问题,从double/float到无符号整数的直接转换是不可移植的.我发现我的代码中有一些情况会发生这种情况,我想告诉g ++警告我,如果发生这种情况,但我找不到这样的选择.有谁知道是否有选项可以做到这一点?
注意:我确实看到了-Wconversion,但是它也警告了我不关心的所有其他转换(比如将int转换为unsigned int,它可以按标准移植).
编辑:这是一个代码示例,我希望看到一个警告:
double dblNumber = -234;
unsigned long uintNumber = dblNumber;
Run Code Online (Sandbox Code Playgroud)
在g ++的一个版本中,这给了我一个整数值0xFFFFFF16(在2的补码中为-234).在另一个它给我0.显然代码是模糊的,这就是为什么它可以理解为不被认为是便携式的.
试试看:
volatile float bob = -344.0f;
unsigned int fred = (unsigned int)bob;
printf("%d\n",fred);
Run Code Online (Sandbox Code Playgroud)
输出将为0.
很明显我期待它就好像我已经从一个带符号的int转换为一个未编译的int(它确实包装并在iphone上按预期运行)
我们假设它与浮点设置有关.
有任何想法吗?
我在这里读到:
根据C99§6.3.1.4脚注50:
当将实数浮点类型的值转换为无符号类型时,无需执行将整数类型的值转换为无符号类型时执行的剩余操作.因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1).
现在,我对以下之间的细微差别感兴趣(这次是C++ 03!)
double d1 = 257;
double d2 = -2;
unsigned char c1 = d1; // undefined, since d1 > 256
unsigned char c2 = d2; // undefined, since d2 < -1
Run Code Online (Sandbox Code Playgroud)
和
double d1 = 257;
double d2 = -2;
unsigned int i1 = d1; // defined, since d1 <= 2^32
unsigned int i2 = d2; // still undefined, right?
unsigned char c1 = i1; // defined, modulo 2^8, so …Run Code Online (Sandbox Code Playgroud) 我了解 C 中的类型转换在高层次上所做的事情。我知道有时这是隐式完成的,有时需要明确完成。但是我不知道这是如何在低级别发生的:
假设GetSignal返回一个enum类型。
uint8 outValue;
f32_t iValue;
iValue = (f32_t)GetSignal();
outValue = (uint8)((i32_t)iValue);
Run Code Online (Sandbox Code Playgroud)
我的问题是这里发生了什么。我不知道在所有这些类型转换之后如何重新组织这些位。