You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言double转二进制实现代码的运行逻辑疑问求解

问题解答

1. arr[idx/CHAR_BIT]的返回值及打印随机值问题

  • 表达式arr[idx/CHAR_BIT]返回的是unsigned char类型的数值,对应double值内存中第idx/CHAR_BIT个字节的原始二进制内容。
  • 打印出现随机值的原因有两点:
    • 你使用printf("%s", arr)的写法本身错误:%s格式符要求输入的字符数组必须以\0结尾,你是直接把double的内存拷贝到arr数组,数组里没有\0结束符,printf会持续越界读取栈内存直到碰到\0,输出内容自然是无意义的乱码。
    • double10.0的内存存储遵循IEEE754双精度标准,每个字节的原始值大多不属于可打印ASCII字符的范围,就算按单个字符打印也会显示为乱码。

2. 位与&运算的逻辑及奇怪字符问题

运算逻辑

这段位运算的作用是逐位读取double内存的每一位二进制值:

  • idx%CHAR_BIT计算当前需要读取的是某一字节中的第几个比特位,取值范围是0~7(通常CHAR_BIT等于8)
  • 1u << (idx%CHAR_BIT)会生成一个仅目标比特位为1、其余位全为0的掩码
  • 把字节值和掩码做&运算,若结果不为0说明该比特位是1,输出字符'1',否则输出'0'

奇怪字符的原因

你看到的奇怪字符和位运算本身无关,是两个bug导致的:

  • 前面错误的printf("%s", arr)已经先输出了一堆乱码
  • main函数中vals数组仅初始化了1个元素,但是for循环写的是遍历4个元素,会访问数组后面3个未初始化的内存空间,里面的随机值对应的二进制打印时可能出现不可见的控制字符,看起来就像奇怪字符。

修复建议

  • 删掉printf("array is : %s\n", arr);这行错误代码
  • 将main函数的for循环条件改为idx < sizeof(vals)/sizeof(vals[0]),避免数组越界

内容的提问来源于stack exchange,提问作者avii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:15:05