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
相关产品推荐
相关产品推荐

