- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎认为这是一个愚蠢的问题……但我真的找不到答案。所以我在这里问这个问题。
为了学习隐式类型转换,我在 C 上运行以下代码。
#include <stdio.h>
int main()
{
unsigned char i;
char cnt = -1;
int a[255];
for (int k = 0; k < 255; k++)
{
a[k] = k;
}
for (i = cnt - 2; i < cnt; i--)
{
a[i] += a[i + 1];
printf("%d\n", a[i]);
}
return 0;
}
当我运行这个程序时,没有任何反应。
我在第一次迭代时发现for-loop的循环条件为false,所以程序立即退出了for-loop。
但是,我不明白为什么。
据我所知,C 在分配或比较不同类型的变量时会进行隐式转换。所以我认为 i = cnt - 2
,减号操作使值 -3,然后隐式转换为 i 分配值 253。
那么,条件i < cnt
不应该吗?是真的,因为(由于有符号和无符号字符的比较,通过 cnt 的另一个隐式转换)253 小于 255?
如果不是,为什么这是错误的?是否有我遗漏的内容或是否有我不知道的异常(exception)情况?
最佳答案
你的问题一点也不蠢。您接近解决方案:i
被赋值为 -3
但是隐式转换为 i
的类型, unsigned char
, 将值更改为 253
.
为了更准确的解释,您的测试代码中存在多个问题:
char
根据平台和编译器配置,可以签名或未签名,所以 char cnt = -1;
可以存储值 -1
或 255
进入cnt
,或者如果 char
甚至是其他值无符号且多于 8 位。
for (i = cnt - 2; i < cnt; i--)
的行为还取决于是否char
默认情况下是签名还是未签名:
在所有情况下,测试 i < cnt
计算时将两个操作数都转换为 int
(或 unsigned int
在极少数情况下 sizeof(int)==1
)。如果int
可以表示类型的所有值 char
和 unsigned char
,此转换不会更改值。
如果 char
无符号且有 8 位,cnt
具有值 255
所以i
用值 253
初始化循环运行 254 次 i
来自 253
下降到 0
, 然后 i--
存储值 255
再次进入i
,为此测试i < cnt
评估为假。循环打印 507
, 然后 759
, ... 32385
.
如果 char
已签名且有 8 位,您的系统可能就是这种情况,cnt
具有值 -1
和 i
用值 -3
初始化转换为 unsigned char
,即 253
.初试i < cnt
评估为 253 < -1
,这是错误的,导致立即跳过循环体。
你可以强制char
通过为编译器提供适当的标志(例如:gcc -funsigned-char
)默认情况下未签名并测试行为如何变化。使用Godbolt's compiler explorer , 你可以看到 gcc
仅生成 2 条指令以在有符号(默认)情况下返回 0,在无符号情况下返回预期输出。
关于signed 和 unsigned char 之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69029798/
我提出这个问题是因为我没有找到关于这 3 个 gpg 选项之间差异的明确解释: gpg --sign file # produces file.gpg gpg --clear-sign
以下网页介绍了将 Google 登录集成到网络应用程序中的简单工作流程: https://developers.google.com/identity/sign-in/web/sign-in 实现代码
Microsoft 最近向 Azure AD B2C 添加了新的“注册或登录”策略。 https://azure.microsoft.com/en-us/documentation/articles/
鉴于此 xml: 如何选择包含 version="@2.15"的元素?我无法弄清楚如何将 @-sign 放入 XPath。 提前致谢, 埃里克 最佳答案 此 XPath 选择所
我正在为我的网站进行 Slack 集成,包括允许用户使用“使用 Slack 登录”按钮登录。理想情况下,我希望它只要求用户授予 identity.*权限一次,然后下次当他们单击“使用 Slack 登录
在将我的第二个应用程序项目上传到 PlayStore 时,在为新版本上传 .aab 文件时出现以下错误: "Your Android App Bundle is signed with the wro
As Math.sign() 接受数字参数或数字作为字符串,如 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Gl
我已经在我的网站上实现了 Sign In with Apple。但问题是它只适用于我开发者的 Apple ID。 我尝试在同一环境中使用我的个人 Apple ID,并且登录过程也运行良好。 但是,当真
Signed Short (Signed Int16) 乘法解释? short ss = -32768; // 0x8000 SHRT_MIN ss *= (short) -1; printf ("%
class Book attr_accessor :author attr_reader :title attr_reader :comments def initialize(aut
将我面向公众的应用程序部署到 Azure。旨在将身份验证委托(delegate)给 Microsoft、Google、Facebook、Apple 等。因此,一旦用户通过其声称的身份验证并且该提供商返
好吧,我对使用 API 的理解有限 我试图掌握 Adobe Sign API 并遇到了死胡同,在测试页面上我输入了这个并且它有效 但我不知道如何在 C# 中做到这一点 我尝试了以下方法,但知道它缺
上下文 我使用 booth Cognito 用户池和 Cognito 身份池来登录用户。 我想完成一个简单的任务,让用户在 iOS 应用程序(Swift 应用程序)上登录。 我的应用程序基于自定义版本
这可能是一个非常简单的答案,但我无法在任何地方找到它。可能是我以某种方式错过了一个非常基本的 CSS 规则。 这是我的 Sass 代码: h3 { font-size: 20px; m
我见过很多将 hex 转换为 int 的问题,但这些都是 unsigned-> unsigned 的变体。如何将带符号的十六进制转换为 Int? 例如。 somefunc('0xfffff830')
我对 C# 中的准备语句有疑问: OdbcCommand cmd = sql.CreateCommand(); cmd.CommandText = "SELECT UNIQUE_ID FROM use
我想知道是否有办法在我发送授权请求之前如果用户是第一次在 Apple 注册我的应用程序,或者他/她是否已经注册,只需登录即可。 基本上我的应用程序中有一个注册屏幕,用户可以在其中创建两种类型的用户和一
我是 Rails 的新手,我正在使用“设计”gem 进行身份验证。 首先,我通过默认注册页面(例如/users/sign_up)添加一个新用户 然后,我按照从 Devise before filter
当我使用 web3.eth.sign() 方法和 web3.eth.accounts.sign() 方法对字符串进行签名时。两个签名的结果值不同。我不知道为什么这两个结果不同。 我正在使用最新的 we
我正在使用受信任的 CA 颁发的证书签署 EXE 程序。 我正在使用 Windows SDK v6.0a 中的 signtool.exe。 该证书位于计算机商店中,位于“个人”文件夹中。 我的命令行是
我是一名优秀的程序员,十分优秀!