有符号多头到浮动,然后有符号空头 [关闭]

Signed long to float and then to signed short [closed]

提问人:Rana Zeeshan 提问时间:2/6/2023 最后编辑:Zakys98Rana Zeeshan 更新时间:2/7/2023 访问量:132

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

10个月前关闭。

这是我的代码:

#include <stdio.h>
typedef signed long     int32_t;
typedef signed short        int16_t;

int main() {
    int32_t var1 = 1200;
    int16_t var2;
    
    var2 = (int16_t)((float)var1/1000.0);
    
    printf("Hello World: %d", var2); // prints 1 should print 1.2

    return 0;
}

在 C 中的数据类型之间进行类型转换。因此,我试图在有符号的短整型中将“var2”的值获取为 1.2,但我得到了值 1。我必须使用 16 位寄存器,而不能使用 32 位浮点数。

C 铸造 浮点

评论

1赞 Lundin 2/6/2023
你使用那些丑陋的 typedefs 而不是 stdint.h 有什么原因吗?
1赞 Lundin 2/6/2023
至于问题,您只是为 printf 使用了错误的格式说明符......
1赞 Tom Karzes 2/6/2023
您正在尝试用于设置值的格式。那行不通,它们不兼容。你的编译器应该警告过你。您需要使用 来格式化 .而且它不可能等于 .这不是一个整数。您是否以某种方式认为可以强制 an 像浮点值一样运行?你不能。%fint%dint1.2int16_t
0赞 Rana Zeeshan 2/6/2023
@Lundin是的,我知道这是一个错误,应该使用 %d。
0赞 Bob__ 2/6/2023
请注意,在某些平台上可能需要 64 位,另外,请详细说明“我正在尝试在签名短裤中将'var2'的值作为 1.2”,您到底想打印什么?long

答:

1赞 0___________ 2/6/2023 #1

printf("Hello World: %d", var2); // prints 1 should print 1.2

不,它不应该。

  1. (float)var1 converts自。float
  2. (float)var1/ 1000.0- 结果 1.2
  3. (int16_t)1.2- 转换为整数,结果为1

顺便说一句,您不能使用格式打印。要 100% 正确,您应该使用格式来打印短整数。1.2%d%hd

强制转换不会二进制复制,仅在类型之间进行转换

评论

0赞 Andrew 2/6/2023
几个错误/“做不到”的答案,然后就关闭了?糟糕的形式!
1赞 Lam 2/6/2023 #2

var2 是“有符号短整型”类型,它只能包含整数值。如果为其分配十进制数,则会截断十进制部分 (0.2),而仅保留整数部分 (1)。我希望我能有所帮助。有好的一天!

1赞 stark 2/6/2023 #3

您已经在 var1 的 16 位 int 中拥有它。您的表示形式称为“缩放整数”。只需在需要打印值时进行转换即可。

printf("%f\n", (float)(var1/1000.0));