c++ - 将包含 11111111 的地址读取为无符号整数显示 4294967295
问题描述
所以,我正在尝试一些东西,我注意到如果你读取一个包含 11111111 作为无符号整数的地址,它表明值是 4294967295 而不是 255,这是为什么呢?
代码示例:
unsigned int a = 255;
unsigned int* p = &a;
char *p0 = (char*)p;
cout << (void*)p0 << " " <<(unsigned int)*p0<<endl;
解决方案
char *p0 = (char*)p;
这里p0
指向 的最低字节p
。碰巧存储在那里的值取决于字节序。可以是 0x00(大端)或 0xFF(小端)。
什么是 CPU 字节序?*p0
在这里您可以访问假定的内容char
。由于char
具有实现定义的符号,它可以管理数字 -128 到 127(假设 2 的补码)或 0 到 255。默认情况下是有符号还是无符号?您的特定系统似乎使用有符号
char
、2 的补码、Little Endian。这意味着原始二进制值 0xFF 被解释为 -1 十进制。(unsigned int)*p0
强制从 -1 转换为unsigned int
类型。这是在这个定义明确的规则之后完成的(C 6.3.1.4,相同的规则适用于 C++):否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。
-1
+UINT_MAX
+ 一个 =
-1
+UINT_MAX
+1
=
UINT_MAX
=
4294967295
在你的 32 位系统上。
经验教训:永远不要使用char
文本以外的任何东西,永远不要使用它来存储值。如果您需要 8 位整数类型或其他东西来表示原始二进制文件,请使用unsigned char
或uint8_t
.
推荐阅读
- python - AttributeError:“pyodbc.Cursor”对象没有属性“方言”
- python - 如何从普通函数中向 Python Dask 调度程序提交任务
- virtual-machine - 如何在访客上启用 IOMMU
- javascript - 使用 npm 而不是 yarn 安装包时出错
- javascript - 如何将变量传递给正则表达式?
- php - 如何修复 symfony 错误:无法自动装配“App\Controller\ArticleController::create()”的参数 $request?
- php - 试图获取非对象的属性“Nom”
- laravel - 如何在不知道结束日期的情况下创建 CarbonPeriod?
- java - 带有 OR() AND() 语句的 QueryDSL 谓词返回错误结果
- redirect - 企业应用程序的 OAuth2 重定向 URI