Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 给定一个%hhu和一个输入1025,哪个部分映射到无符号字符?_C_Scanf_Language Lawyer - Fatal编程技术网

C 给定一个%hhu和一个输入1025,哪个部分映射到无符号字符?

C 给定一个%hhu和一个输入1025,哪个部分映射到无符号字符?,c,scanf,language-lawyer,C,Scanf,Language Lawyer,以下程序的输出是1还是0,还是未定义的行为 int main() { unsigned char u = 10; sscanf("1025","%hhu",&u); printf("u, is it 0 or is it 1? u's value is ... %hhu", u); } 根据fscanf%u和hh(即%hhu),语义是基于strtoul函数的语义和指向无符号字符的类型指针的映射定义的: 12) 转换说明符及其含义如下: “u” 匹配格式相同的可选带符号十进制

以下程序的输出是
1
还是
0
,还是未定义的行为

int main() {
  unsigned char u = 10;
  sscanf("1025","%hhu",&u);
  printf("u, is it 0 or is it 1? u's value is ... %hhu", u);
}
根据
fscanf
%u
hh
(即
%hhu
),语义是基于
strtoul
函数的语义和指向无符号字符的类型指针的映射定义的:

12) 转换说明符及其含义如下:

“u” 匹配格式相同的可选带符号十进制整数 与strtoul函数的主题序列所预期的一样 基本参数的值为10。相应的参数应为a 指向无符号整数的指针

11) 长度修饰符及其应用 含义是:

“hh”指定以下d、i、o、u、x、, 十、 或n转换说明符应用于具有类型指针的参数 到有符号字符或无符号字符

但是,如果输入序列表示超过8位的整数值,那么整数值的哪一部分映射到无符号字符的8位呢?它是否定义为最不重要的部分,它是否依赖于持久性,它是否未指定,或者它是否甚至产生未定义的行为

int main() {
  unsigned char u = 10;
  sscanf("1025","%hhu",&u);
  printf("u, is it 0 or is it 1? u's value is ... %hhu", u);
}
我不能相信这是未定义或未指定的行为。这意味着用户输入可能会在使用
scanf(“%hhu”,&u)
的程序中引入这种行为,并且在每次使用
scanf
之前检查用户输入在我看来是荒谬的。

未定义。看

10除%说明符外,输入项(或在%n指令的情况下,输入字符的计数)被转换为适合转换说明符的类型。如果输入项不是匹配序列,则指令执行失败:此条件为匹配失败。除非赋值抑制由*表示,否则转换结果将放在尚未收到转换结果的format参数后的第一个参数所指向的对象中。如果此对象没有适当的类型,,或者如果转换结果无法在对象中表示,则行为未定义


对位:将1025转换为
无符号字符的结果为1(6.3.1.3/2)。1可以用
u
@melpomene来表示:我相信“转换”这个词在这里的用法是不同的。是的,值
1025
无符号字符的类型转换产生
1
(例如假设
char\u位==8
)。但是这里讨论的“转换”是从输入项(一系列字符)到目标类型。该转换(将字符串
“1025”
转换为整数)的结果是1025,不能用
无符号字符
对象表示。@melpomene:我同意这里存在一些歧义和未指定,但我认为结论是正确的。没有任何语言表明转换首先是通过从字符序列转换为任意精度的整数,然后像转换整数类型一样进行的。有人建议(但没有明确说明)转换是通过
strtol
-系列函数进行的(并非所有类型都存在);在这种情况下,超出界限的值会产生错误,而不是换行。@R。。
strtol
内容只描述输入的格式(特别是strto(u)l的“主题序列”),而不是实际的转换/映射。@KeithThompson给出了一种任意精度的语义,但它没有阐明“转换”在该上下文中的含义。具体来说,在这种情况下,我们必须知道一些抽象数学整数(甚至没有C类型)是如何转换为
无符号字符
(或
无符号整数
),等等。如果它是模MAX+1(通常用于无符号整数),则所有值都是可表示的;如果没有,我们会得到UB。