【问题标题】:assign zero in unsigned short int in c在 c 中的 unsigned short int 中分配零
【发布时间】:2016-01-27 13:49:27
【问题描述】:

我尝试将零分配给名为列表的结构中的字段

list.ultimo = 0;

但是当我使用 printf 时

printf("%d", list.ultimo);

我得到结果

32766

但是当我添加时

unsigned short int cero = 0;

printf的结果是正确的,不管用cero。为什么?

lista.h

#ifndef LISTA_H
#define LISTA_H

typedef struct{
  elemento lista[TAMANOMAX];
  unsigned short int ultimo;
}LISTA;

void Insertar(elemento, unsigned short int posicion, LISTA);
#endif

lista.c

#include<stdio.h>

typedef short int elemento;
#ifndef TAMANOMAX
#define TAMANOMAX 10
#endif
#include"lista.h"

void Insertar(elemento x, unsigned short int p, LISTA lista){
  if (lista.ultimo >= TAMANOMAX){
    puts("full list");
    printf("%hu",lista.ultimo); 
  }
}

main.c

#include<stdio.h>

typedef unsigned short int elemento;
#define TAMANOMAX 4
#include"lista.h"

int main(){
  LISTA esferas;
  esferas.ultimo = 0; 
  Insertar(2,0,esferas);
  printf("\n%hu\n", esferas.ultimo);
  return 0; 
}

结果是

$gcc -Wall lista.c main.c

full list

32765

0

我是新手,我现在很慢,很抱歉耽搁了

【问题讨论】:

  • 你不觉得这些信息还不够吗?显示结构的定义以及list的定义。
  • 请不要告诉我ultimo 是未签名的,而您正在使用%d 打印...
  • @SouravGhosh 哈哈!你猜错了 - 这是一个无符号短片
  • @MartinJames 是的,我的错……我错过了标题……;)
  • 您应该向我们展示更多代码来帮助您

标签: c printf unsigned short format-specifiers


【解决方案1】:

使用%hd 打印short int,使用%hu 打印unsigned short int%d 代表int

编辑:现在您已经发布了完整的代码,看来TAMANOMAXlista.c 中设置为10,但在main.c 中设置为4,导致您的@987654333 之间不兼容@函数和Insertar一个。您应该在所有文件中具有相同的值。如果您想使用不同的数组长度,请在您的 LISTA 结构中添加一个 length 成员。但是TAMANOMAX 在任何地方都应该完全一样,否则实际上您正在使用不同的数据类型,您的程序将无法运行。

【讨论】:

  • 虽然这是个好建议,但我认为它不能回答问题。 %dsizeof(unsigned short) &lt; sizeof(int) 时对 unsigned short 工作得很好,在另一种情况下,vale 0 不应该变成 32766 - 未定义的行为与否。正在发生其他事情(很可能问题中缺少信息)。
  • 感谢回复,我认为不是格式说明符与“% hu”的问题我有同样的错误结果。
  • 确实,正如@SanderDeDycker 已经注意到的那样。但是在这种情况下,请发布一个 Minimal, Complete, and Verifiable example,因为您得到的结果不仅仅是好奇:stackoverflow.com/help/mcve
  • 我觉得是预处理器的问题,TAMANOMAX常量
  • 非常感谢,我尝试从 main.c 控制数组的大小,模拟函数重载,默认使用选项 TAMANOMAX 10。以后会更细心的问和代码
【解决方案2】:

对参数类型使用不匹配的格式说明符会调用undefined behavior

引用C11 标准,第 7.21.6.1 章,fprintf() 函数

[..] 如果有任何参数 不是相应转换规范的正确类型,行为是 未定义。

关于%d 格式说明符,

d,i
int 参数 [....]

所以,%d 需要 int

根据您的问题标题,ultimounsigned short int 并且您正在使用 %d 打印值。

您应该使用%hu 打印unsigned short int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多