相关疑难解决方法(0)

在 Win32 上双转换为 unsigned int 被截断为 2,147,483,648

编译以下代码:

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)

c floating-point x86 casting visual-c++

85
推荐指数
3
解决办法
4462
查看次数

将负浮点值转换为unsigned int的行为是什么?

如果将负浮点值转换为无符号整数类型的值,会发生什么?标准报价将不胜感激.我面临的问题是从变量类转换为无符号整数类型的值,它包含一个浮点类型的对象.

例:

unsigned i = -.1;
Run Code Online (Sandbox Code Playgroud)

c floating-point language-lawyer

35
推荐指数
3
解决办法
2260
查看次数

当使用-Wconversion将double/float转换为无符号整数时,g ++会发出警告

可能重复:
g ++ -Wall没有关于double-> int cast的警告

根据这里的问题,从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.显然代码是模糊的,这就是为什么它可以理解为不被认为是便携式的.

c c++ g++

10
推荐指数
1
解决办法
1302
查看次数

iphone:浮动转换为无符号整数如果它们是负数则设置为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上按预期运行)

我们假设它与浮点设置有关.

有任何想法吗?

iphone floating-point casting

7
推荐指数
1
解决办法
2450
查看次数

double to unsigned int/char

在这里读到:

根据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++ floating-point unsigned

7
推荐指数
1
解决办法
656
查看次数

C 中的类型转换是怎么回事?

我了解 C 中的类型转换在高层次上所做的事情。我知道有时这是隐式完成的,有时需要明确完成。但是我不知道这是如何在低级别发生的:

假设GetSignal返回一个enum类型。

 uint8 outValue;
 f32_t iValue;
 iValue = (f32_t)GetSignal();
 outValue = (uint8)((i32_t)iValue);
Run Code Online (Sandbox Code Playgroud)

我的问题是这里发生了什么。我不知道在所有这些类型转换之后如何重新组织这些位。

c low-level

6
推荐指数
1
解决办法
112
查看次数