我正在实现一个学习C的玩具项目,我有一个关于无符号类型转换规则的看似简单的问题.
特别是,我想知道C标准是否希望转换为较小的无符号类型的无符号类型在不使用任何位屏蔽的情况下简单地丢失其最重要的位.
示例:0xABC
示例代码(Shared link):
#include <stdint.h>
#include <stdio.h>
void print_small_hex_value(uint8_t value) {
printf("Small hex value from function: %llx\n", value);
}
int main()
{
uint64_t large_value = 0xABCDEFABCDEFABCD;
printf("Large hex value: %llx\n", large_value);
uint8_t small_value = large_value; /* without bit mask */
printf("Small hex value: %llx\n", small_value);
uint8_t small_value_masked = large_value & 0xFF; /* with bit mask */
printf("Small hex value masked: %llx\n", small_value);
printf("\n");
print_small_hex_value(large_value); /* print from function */
print_small_hex_value(large_value & 0xFF);
print_small_hex_value(small_value);
}
输出:
Large hex value: abcdefabcdefabcd
Small hex value: cd
Small hex value masked: cd
Small hex value from function: cd
Small hex value from function: cd
Small hex value from function: cd
在我看来,即使没有位面具,这种"神奇的"转换也有效.
那么,为什么有这么多代码库(即,CPython)强制位通过位屏蔽(又名value & 0xFF
)?
如果没有必要,是否只是稍后由编译器省略?难道只是我没有注意到,在这些情况下,您实际上正在处理有符号的整除吗?
如果值越大(即,uint64_t
)作为uint8_t
参数传递还是存储在uint8_t
变量中?编辑者对这两种情况的处理是否有所不同?
有人能就此事指出值得信赖的来源(例如C标准)吗?