c - 当我们在 C 中将一个数字转换为一个较小的数字时,究竟会发生什么?
问题描述
假设我有这样的事情:
unsigned int x = (unsigned int)SomeLong;
SomeLong
如果不适合 4 个字节,究竟会发生什么?新的内存布局是什么样的?在 C 中将数字转换为较小大小的数字究竟是如何工作的?怎么了?
解决方案
它会截断内存。这个程序显示了这一点,它显示了 long 的二进制表示,然后将 long 的二进制表示转换为更小的 int:
#include <stdio.h>
void Print8Byte(unsigned long Value) {
for (unsigned char i = 0; i < 64; i++) {
union {
unsigned long Value;
unsigned First:1;
} Cast = {.Value = Value>>i};
putchar('0'+Cast.First);
}
putchar('\n');
}
int main(int argc, char *argv[]) {
unsigned long Num = 0x284884848; //Arbitrary Value
Print8Byte(Num);
Print8Byte((unsigned int)Num);
}
结果:
0001001000010010000100010010000101000000000000000000000000000000 000100100001001000010001001000010000000000000000000000000000
推荐阅读
- javascript - 如何加快我的 vue 项目的画廊部分?
- azure - 是否可以在 Azure Pipelines YAML 中定义具有依赖关系的资源
- angular - Angular Ag Grid - 单元格渲染按钮删除行?
- php - php: UPDATE SET 函数不更新表
- amazon-web-services - 将 Athena ODBC 驱动程序与 credential_source Ec2InstanceMetadata 一起使用
- c++ - 为什么 C++20 中的空结构没有隐式宇宙飞船运算符?
- file-type - geany 自定义文件类型 .svrf 用于语法高亮
- c++ - 转换、强制转换和强制转换有什么区别?
- python - 使用 optuna 从 python 成功访问 MySQL 数据库
- kubernetes - 我们如何正确分配 pod,以便 KFServing 可以将 GPU 实例缩减到零?