c - 将 128 分配给 c 中的 char 变量
问题描述
输出是 128 的 32 位 2 的补码,即 4294967168。如何?
#include <stdio.h>
int main()
{
char a;
a=128;
if(a==-128)
{
printf("%u\n",a);
}
return 0;
}
解决方案
在打开警告的情况下编译代码会给出:
warning: overflow in conversion from 'int' to 'char' changes value from '128' to '-128' [-Woverflow]
它告诉您,a=128;
您的平台上的作业没有很好地定义。
标准说:
6.3.1.3 有符号和无符号整数
1 当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则不变。
2 否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到值在新类型的范围内。
3 否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是实现定义的信号被引发。
所以我们无法知道发生了什么,因为这取决于您的系统。
但是,如果我们进行一些猜测(注意这只是猜测):
128 作为 8 位将是 0b1000.0000
因此,当您致电printf
获得转换的int
地方时,将会有一个符号扩展,例如:
0b1000.0000 ==> 0b1111.1111.1111.1111.1111.1111.1000.0000
其中 - 打印为无符号代表数字 4294967168
推荐阅读
- javascript - JQuery 到 vanilla JavaScript 的翻译不起作用
- c# - 如何更改当前计划的hangfire中作业的执行时间?
- c++ - WIC - Exif 元数据查询 - 如何获取图像描述
- parsing - 如何使用 asn1c 生成的代码解码 GSM-TCAP 消息
- python - 为什么 Django 应用程序无法连接到 Docker 容器中的远程 MySQL 数据库?
- c++ - 关于 std::add_pointer 实现的问题
- c++ - 为什么在 C++ 中有不同的运算符重载方式?
- gradle - 如何在 intellij 中处理多个 gradle 项目和依赖项
- azure - 如何获取 Azure ID 令牌以用于 webapi 中的授权?
- ruby-on-rails - 如何在运行多台服务器的生产环境中使 ActiveRecord 查询更快?